LLVM  9.0.0svn
XCoreSelectionDAGInfo.cpp
Go to the documentation of this file.
1 //===-- XCoreSelectionDAGInfo.cpp - XCore SelectionDAG Info ---------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the XCoreSelectionDAGInfo class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "XCoreTargetMachine.h"
14 using namespace llvm;
15 
16 #define DEBUG_TYPE "xcore-selectiondag-info"
17 
19  SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
20  SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
21  MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
22  unsigned SizeBitWidth = Size.getValueSizeInBits();
23  // Call __memcpy_4 if the src, dst and size are all 4 byte aligned.
24  if (!AlwaysInline && (Align & 3) == 0 &&
25  DAG.MaskedValueIsZero(Size, APInt(SizeBitWidth, 3))) {
26  const TargetLowering &TLI = *DAG.getSubtarget().getTargetLowering();
29  Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
30  Entry.Node = Dst; Args.push_back(Entry);
31  Entry.Node = Src; Args.push_back(Entry);
32  Entry.Node = Size; Args.push_back(Entry);
33 
35  CLI.setDebugLoc(dl)
36  .setChain(Chain)
40  "__memcpy_4", TLI.getPointerTy(DAG.getDataLayout())),
41  std::move(Args))
42  .setDiscardResult();
43 
44  std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
45  return CallResult.second;
46  }
47 
48  // Otherwise have the target-independent code call memcpy.
49  return SDValue();
50 }
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
This class represents lattice values for constants.
Definition: AllocatorList.h:23
virtual const TargetLowering * getTargetLowering() const
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
unsigned getValueSizeInBits() const
Returns the size of the value in bits.
SDValue getExternalSymbol(const char *Sym, EVT VT)
CallLoweringInfo & setChain(SDValue InChain)
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:407
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, unsigned Align, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const override
Emit target-specific code that performs a memcpy.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space...
Definition: DataLayout.cpp:766
static Type * getVoidTy(LLVMContext &C)
Definition: Type.cpp:160
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
std::vector< ArgListEntry > ArgListTy
This structure contains all information that is necessary for lowering calls.
This class contains a discriminated union of information about pointers in memory operands...
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:221
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Class for arbitrary precision integers.
Definition: APInt.h:69
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
const TargetSubtargetInfo & getSubtarget() const
Definition: SelectionDAG.h:409
uint32_t Size
Definition: Profile.cpp:46
bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if &#39;Op & Mask&#39; is known to be zero.
static bool isVolatile(Instruction *Inst)
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
LLVMContext * getContext() const
Definition: SelectionDAG.h:414
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)