diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index ff66fc061e51..74be26180a5f 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "RISCVISelLowering.h" +#include "MCTargetDesc/RISCVMCTargetDesc.h" #include "MCTargetDesc/RISCVMatInt.h" #include "RISCV.h" #include "RISCVMachineFunctionInfo.h" @@ -7486,6 +7487,7 @@ SDValue RISCVTargetLowering::lowerKernArgParameterPtr(SelectionDAG &DAG, return DAG.getObjectPtrOffset(SL, BasePtr, TypeSize::Fixed(Offset)); } + SDValue RISCVTargetLowering::getFPExtOrFPRound(SelectionDAG &DAG, SDValue Op, const SDLoc &DL, @@ -7566,6 +7568,17 @@ SDValue RISCVTargetLowering::lowerKernargMemParameter( MachineMemOperand::MODereferenceable | MachineMemOperand::MOInvariant); +if(Arg->Flags.getPointerAddrSpace() == RISCVAS::LOCAL_ADDRESS) { + MVT XLenVT = Subtarget.getXLenVT(); + MachineSDNode *LDSNode = DAG.getMachineNode( + RISCV::CSRRS, SL, XLenVT, + DAG.getTargetConstant(0x806, SL, XLenVT), + DAG.getRegister(RISCV::X0, XLenVT)); + SDValue Add = DAG.getObjectPtrOffset(SL, Load, SDValue(LDSNode, 0)); + SDValue Val = convertArgType(DAG, VT, MemVT, SL, Add, Signed, Arg); + return DAG.getMergeValues({ Val, Load.getValue(1) }, SL); + } + SDValue Val = convertArgType(DAG, VT, MemVT, SL, Load, Signed, Arg); // return DAG.getMergeValues({ Load, Load.getValue(1) }, SL); return DAG.getMergeValues({ Val, Load.getValue(1) }, SL);