[PATCH] R600/SI: Make argument loads invariant
Tom Stellard
tom at stellard.net
Mon Jul 28 07:05:55 PDT 2014
On Sat, Jul 26, 2014 at 10:26:09PM +0000, Matt Arsenault wrote:
> http://reviews.llvm.org/D4685
LGTM.
>
> Files:
> lib/Target/R600/SIISelLowering.cpp
>
> Index: lib/Target/R600/SIISelLowering.cpp
> ===================================================================
> --- lib/Target/R600/SIISelLowering.cpp
> +++ lib/Target/R600/SIISelLowering.cpp
> @@ -310,19 +310,27 @@
> }
>
> SDValue SITargetLowering::LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
> - SDLoc DL, SDValue Chain,
> + SDLoc SL, SDValue Chain,
> unsigned Offset, bool Signed) const {
> + const DataLayout *DL = getDataLayout();
> +
> + Type *Ty = VT.getTypeForEVT(*DAG.getContext());
> +
> MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
> - PointerType *PtrTy = PointerType::get(VT.getTypeForEVT(*DAG.getContext()),
> - AMDGPUAS::CONSTANT_ADDRESS);
> - SDValue BasePtr = DAG.getCopyFromReg(Chain, DL,
> + PointerType *PtrTy = PointerType::get(Ty, AMDGPUAS::CONSTANT_ADDRESS);
> + SDValue BasePtr = DAG.getCopyFromReg(Chain, SL,
> MRI.getLiveInVirtReg(AMDGPU::SGPR0_SGPR1), MVT::i64);
> - SDValue Ptr = DAG.getNode(ISD::ADD, DL, MVT::i64, BasePtr,
> + SDValue Ptr = DAG.getNode(ISD::ADD, SL, MVT::i64, BasePtr,
> DAG.getConstant(Offset, MVT::i64));
> - return DAG.getExtLoad(Signed ? ISD::SEXTLOAD : ISD::ZEXTLOAD, DL, VT, Chain, Ptr,
> - MachinePointerInfo(UndefValue::get(PtrTy)), MemVT,
> - false, false, MemVT.getSizeInBits() >> 3);
> -
> + SDValue PtrOffset = DAG.getUNDEF(getPointerTy(AMDGPUAS::CONSTANT_ADDRESS));
> + MachinePointerInfo PtrInfo(UndefValue::get(PtrTy));
> +
> + return DAG.getLoad(ISD::UNINDEXED, Signed ? ISD::SEXTLOAD : ISD::ZEXTLOAD,
> + VT, SL, Chain, Ptr, PtrOffset, PtrInfo, MemVT,
> + false, // isVolatile
> + true, // isNonTemporal
> + true, // isInvariant
> + DL->getABITypeAlignment(Ty)); // Alignment
> }
>
> SDValue SITargetLowering::LowerFormalArguments(
> Index: lib/Target/R600/SIISelLowering.cpp
> ===================================================================
> --- lib/Target/R600/SIISelLowering.cpp
> +++ lib/Target/R600/SIISelLowering.cpp
> @@ -310,19 +310,27 @@
> }
>
> SDValue SITargetLowering::LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT,
> - SDLoc DL, SDValue Chain,
> + SDLoc SL, SDValue Chain,
> unsigned Offset, bool Signed) const {
> + const DataLayout *DL = getDataLayout();
> +
> + Type *Ty = VT.getTypeForEVT(*DAG.getContext());
> +
> MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
> - PointerType *PtrTy = PointerType::get(VT.getTypeForEVT(*DAG.getContext()),
> - AMDGPUAS::CONSTANT_ADDRESS);
> - SDValue BasePtr = DAG.getCopyFromReg(Chain, DL,
> + PointerType *PtrTy = PointerType::get(Ty, AMDGPUAS::CONSTANT_ADDRESS);
> + SDValue BasePtr = DAG.getCopyFromReg(Chain, SL,
> MRI.getLiveInVirtReg(AMDGPU::SGPR0_SGPR1), MVT::i64);
> - SDValue Ptr = DAG.getNode(ISD::ADD, DL, MVT::i64, BasePtr,
> + SDValue Ptr = DAG.getNode(ISD::ADD, SL, MVT::i64, BasePtr,
> DAG.getConstant(Offset, MVT::i64));
> - return DAG.getExtLoad(Signed ? ISD::SEXTLOAD : ISD::ZEXTLOAD, DL, VT, Chain, Ptr,
> - MachinePointerInfo(UndefValue::get(PtrTy)), MemVT,
> - false, false, MemVT.getSizeInBits() >> 3);
> -
> + SDValue PtrOffset = DAG.getUNDEF(getPointerTy(AMDGPUAS::CONSTANT_ADDRESS));
> + MachinePointerInfo PtrInfo(UndefValue::get(PtrTy));
> +
> + return DAG.getLoad(ISD::UNINDEXED, Signed ? ISD::SEXTLOAD : ISD::ZEXTLOAD,
> + VT, SL, Chain, Ptr, PtrOffset, PtrInfo, MemVT,
> + false, // isVolatile
> + true, // isNonTemporal
> + true, // isInvariant
> + DL->getABITypeAlignment(Ty)); // Alignment
> }
>
> SDValue SITargetLowering::LowerFormalArguments(
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list