1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===-- ARMSelectionDAGInfo.cpp - ARM SelectionDAG Info -------------------===// 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The LLVM Compiler Infrastructure 4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This file is distributed under the University of Illinois Open Source 6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// License. See LICENSE.TXT for details. 7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===----------------------------------------------------------------------===// 9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This file implements the ARMSelectionDAGInfo class. 11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===----------------------------------------------------------------------===// 13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "ARMTargetMachine.h" 15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "llvm/CodeGen/SelectionDAG.h" 16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "llvm/IR/DerivedTypes.h" 17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeusing namespace llvm; 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 19155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define DEBUG_TYPE "arm-selectiondag-info" 20155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::ARMSelectionDAGInfo(const DataLayout &DL) 22155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : TargetSelectionDAGInfo(&DL) {} 23155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::~ARMSelectionDAGInfo() { 25155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 27155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeSDValue 28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::EmitTargetCodeForMemcpy(SelectionDAG &DAG, SDLoc dl, 29155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Chain, 30155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Dst, SDValue Src, 31155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Size, unsigned Align, 32155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool isVolatile, bool AlwaysInline, 33155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MachinePointerInfo DstPtrInfo, 34155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MachinePointerInfo SrcPtrInfo) const { 35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const ARMSubtarget &Subtarget = DAG.getTarget().getSubtarget<ARMSubtarget>(); 36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Do repeated 4-byte loads and stores. To be improved. 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This requires 4-byte alignment. 38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if ((Align & 3) != 0) 39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return SDValue(); 40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This requires the copy size to be a constant, preferably 41155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // within a subtarget-specific limit. 42155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 43155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!ConstantSize) 44155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return SDValue(); 45155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande uint64_t SizeVal = ConstantSize->getZExtValue(); 46155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!AlwaysInline && SizeVal > Subtarget.getMaxInlineSizeThreshold()) 47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return SDValue(); 48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned BytesLeft = SizeVal & 3; 50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned NumMemOps = SizeVal >> 2; 51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned EmittedNumMemOps = 0; 52f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann EVT VT = MVT::i32; 53f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann unsigned VTSize = 4; 54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned i = 0; 55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Emit a maximum of 4 loads in Thumb1 since we have fewer registers 56f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann const unsigned MAX_LOADS_IN_LDM = Subtarget.isThumb1Only() ? 4 : 6; 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue TFOps[6]; 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Loads[6]; 59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande uint64_t SrcOff = 0, DstOff = 0; 60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Emit up to MAX_LOADS_IN_LDM loads, then a TokenFactor barrier, then the 62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // same number of stores. The loads and stores will get combined into 63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // ldm/stm later on. 64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (EmittedNumMemOps < NumMemOps) { 65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (i = 0; 66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande i < MAX_LOADS_IN_LDM && EmittedNumMemOps + i < NumMemOps; ++i) { 67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Loads[i] = DAG.getLoad(VT, dl, Chain, 68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getNode(ISD::ADD, dl, MVT::i32, Src, 69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getConstant(SrcOff, MVT::i32)), 70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SrcPtrInfo.getWithOffset(SrcOff), isVolatile, 71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande false, false, 0); 72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TFOps[i] = Loads[i].getValue(1); 73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SrcOff += VTSize; 74155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande makeArrayRef(TFOps, i)); 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (i = 0; 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande i < MAX_LOADS_IN_LDM && EmittedNumMemOps + i < NumMemOps; ++i) { 80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TFOps[i] = DAG.getStore(Chain, dl, Loads[i], 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getNode(ISD::ADD, dl, MVT::i32, Dst, 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getConstant(DstOff, MVT::i32)), 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DstPtrInfo.getWithOffset(DstOff), 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande isVolatile, false, 0); 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DstOff += VTSize; 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande makeArrayRef(TFOps, i)); 89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande EmittedNumMemOps += i; 91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (BytesLeft == 0) 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Chain; 95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 96155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Issue loads / stores for the trailing (1 - 3) bytes. 97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned BytesLeftSave = BytesLeft; 98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande i = 0; 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (BytesLeft) { 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (BytesLeft >= 2) { 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VT = MVT::i16; 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VTSize = 2; 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VT = MVT::i8; 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VTSize = 1; 106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Loads[i] = DAG.getLoad(VT, dl, Chain, 109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getNode(ISD::ADD, dl, MVT::i32, Src, 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getConstant(SrcOff, MVT::i32)), 111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SrcPtrInfo.getWithOffset(SrcOff), 112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande false, false, false, 0); 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TFOps[i] = Loads[i].getValue(1); 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++i; 115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SrcOff += VTSize; 116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BytesLeft -= VTSize; 117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande makeArrayRef(TFOps, i)); 120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande i = 0; 122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BytesLeft = BytesLeftSave; 123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (BytesLeft) { 124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (BytesLeft >= 2) { 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VT = MVT::i16; 126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VTSize = 2; 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VT = MVT::i8; 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande VTSize = 1; 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TFOps[i] = DAG.getStore(Chain, dl, Loads[i], 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getNode(ISD::ADD, dl, MVT::i32, Dst, 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getConstant(DstOff, MVT::i32)), 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DstPtrInfo.getWithOffset(DstOff), false, false, 0); 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++i; 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DstOff += VTSize; 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BytesLeft -= VTSize; 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande makeArrayRef(TFOps, i)); 142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Adjust parameters for memset, EABI uses format (ptr, size, value), 145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// GNU library uses (ptr, value, size) 146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// See RTABI section 4.3.4 147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeSDValue ARMSelectionDAGInfo:: 148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeEmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl, 149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Chain, SDValue Dst, 150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SDValue Src, SDValue Size, 151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande unsigned Align, bool isVolatile, 152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MachinePointerInfo DstPtrInfo) const { 153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const ARMSubtarget &Subtarget = DAG.getTarget().getSubtarget<ARMSubtarget>(); 154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Use default for non-AAPCS (or MachO) subtargets 155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!Subtarget.isAAPCS_ABI() || Subtarget.isTargetMachO() || 156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Subtarget.isTargetWindows()) 157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return SDValue(); 158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const ARMTargetLowering &TLI = 160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *static_cast<const ARMTargetLowering*>(DAG.getTarget().getTargetLowering()); 161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TargetLowering::ArgListTy Args; 162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TargetLowering::ArgListEntry Entry; 163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // First argument: data pointer 165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Type *IntPtrTy = TLI.getDataLayout()->getIntPtrType(*DAG.getContext()); 166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Node = Dst; 167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Ty = IntPtrTy; 168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Args.push_back(Entry); 169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Second argument: buffer size 171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Node = Size; 172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Ty = IntPtrTy; 173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.isSExt = false; 174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Args.push_back(Entry); 175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Extend or truncate the argument to be an i32 value for the call. 177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (Src.getValueType().bitsGT(MVT::i32)) 178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Src = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src); 179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande else 180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Src = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src); 181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Third argument: value to fill 183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Node = Src; 184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.Ty = Type::getInt32Ty(*DAG.getContext()); 185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Entry.isSExt = true; 186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Args.push_back(Entry); 187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Emit __eabi_memset call 189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TargetLowering::CallLoweringInfo CLI(DAG); 190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande CLI.setDebugLoc(dl).setChain(Chain) 191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande .setCallee(TLI.getLibcallCallingConv(RTLIB::MEMSET), 192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Type::getVoidTy(*DAG.getContext()), 193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::MEMSET), 194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TLI.getPointerTy()), std::move(Args), 0) 195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande .setDiscardResult(); 196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI); 198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return CallResult.second; 199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande