LLVM 20.0.0git
HexagonSelectionDAGInfo.cpp
Go to the documentation of this file.
1//===-- HexagonSelectionDAGInfo.cpp - Hexagon 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 HexagonSelectionDAGInfo class.
10//
11//===----------------------------------------------------------------------===//
12
15using namespace llvm;
16
17#define DEBUG_TYPE "hexagon-selectiondag-info"
18
20 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
21 SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
22 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
23 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
24 if (AlwaysInline || Alignment < Align(4) || !ConstantSize)
25 return SDValue();
26
27 uint64_t SizeVal = ConstantSize->getZExtValue();
28 if (SizeVal < 32 || (SizeVal % 8) != 0)
29 return SDValue();
30
31 // Special case aligned memcpys with size >= 32 bytes and a multiple of 8.
32 //
33 const TargetLowering &TLI = *DAG.getSubtarget().getTargetLowering();
36 Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
37 Entry.Node = Dst;
38 Args.push_back(Entry);
39 Entry.Node = Src;
40 Args.push_back(Entry);
41 Entry.Node = Size;
42 Args.push_back(Entry);
43
44 const char *SpecialMemcpyName =
45 "__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes";
46 const MachineFunction &MF = DAG.getMachineFunction();
47 bool LongCalls = MF.getSubtarget<HexagonSubtarget>().useLongCalls();
48 unsigned Flags = LongCalls ? HexagonII::HMOTF_ConstExtended : 0;
49
51 CLI.setDebugLoc(dl)
52 .setChain(Chain)
54 TLI.getLibcallCallingConv(RTLIB::MEMCPY),
57 SpecialMemcpyName, TLI.getPointerTy(DAG.getDataLayout()), Flags),
58 std::move(Args))
60
61 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
62 return CallResult.second;
63}
uint64_t Size
uint64_t getZExtValue() const
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:846
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const override
Emit target-specific code that performs a memcpy.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:226
const TargetSubtargetInfo & getSubtarget() const
Definition: SelectionDAG.h:489
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:487
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:482
LLVMContext * getContext() const
Definition: SelectionDAG.h:500
SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
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 class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual const TargetLowering * getTargetLowering() const
static Type * getVoidTy(LLVMContext &C)
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
This class contains a discriminated union of information about pointers in memory operands,...
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setChain(SDValue InChain)