diff options
Diffstat (limited to 'lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp')
| -rw-r--r-- | lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 6 | 
1 files changed, 5 insertions, 1 deletions
| diff --git a/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index f25f4d4693ea..7cb0e12a6809 100644 --- a/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -1451,7 +1451,11 @@ bool AMDGPUDAGToDAGISel::SelectSMRD(SDValue Addr, SDValue &SBase,                                       SDValue &Offset, bool &Imm) const {    SDLoc SL(Addr); -  if (CurDAG->isBaseWithConstantOffset(Addr)) { +  // A 32-bit (address + offset) should not cause unsigned 32-bit integer +  // wraparound, because s_load instructions perform the addition in 64 bits. +  if ((Addr.getValueType() != MVT::i32 || +       Addr->getFlags().hasNoUnsignedWrap()) && +      CurDAG->isBaseWithConstantOffset(Addr)) {      SDValue N0 = Addr.getOperand(0);      SDValue N1 = Addr.getOperand(1); | 
