diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index 231ed5449969a8..e6bfc00f30992c 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -1874,19 +1874,30 @@ bool AMDGPUDAGToDAGISel::SelectSMRDSgpr(SDValue Addr, SDValue &SBase, bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm(SDValue Addr, SDValue &Offset) const { - bool Imm = false; - return SelectSMRDOffset(Addr, Offset, Imm) && Imm; + if (ConstantSDNode *C = dyn_cast(Addr)) { + if (auto Imm = AMDGPU::getSMRDEncodedOffset(*Subtarget, + C->getZExtValue())) { + Offset = CurDAG->getTargetConstant(*Imm, SDLoc(Addr), MVT::i32); + return true; + } + } + + return false; } bool AMDGPUDAGToDAGISel::SelectSMRDBufferImm32(SDValue Addr, SDValue &Offset) const { assert(Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS); - bool Imm = false; - if (!SelectSMRDOffset(Addr, Offset, Imm)) - return false; + if (ConstantSDNode *C = dyn_cast(Addr)) { + if (auto Imm = AMDGPU::getSMRDEncodedLiteralOffset32(*Subtarget, + C->getZExtValue())) { + Offset = CurDAG->getTargetConstant(*Imm, SDLoc(Addr), MVT::i32); + return true; + } + } - return !Imm && isa(Offset); + return false; } bool AMDGPUDAGToDAGISel::SelectMOVRELOffset(SDValue Index, diff --git a/llvm/lib/Target/AMDGPU/SMInstructions.td b/llvm/lib/Target/AMDGPU/SMInstructions.td index 2119691544031d..43e41f56244577 100644 --- a/llvm/lib/Target/AMDGPU/SMInstructions.td +++ b/llvm/lib/Target/AMDGPU/SMInstructions.td @@ -770,14 +770,16 @@ multiclass SMLoad_Pattern { def : GCNPat < (SIsbuffer_load v4i32:$sbase, (SMRDBufferImm i32:$offset), timm:$cachepolicy), (vt (!cast(Instr#"_IMM") $sbase, $offset, (extract_glc $cachepolicy), - (extract_dlc $cachepolicy))) - >; + (extract_dlc $cachepolicy)))> { + let AddedComplexity = 2; + } // 2. 32-bit IMM offset on CI def : GCNPat < (vt (SIsbuffer_load v4i32:$sbase, (SMRDBufferImm32 i32:$offset), timm:$cachepolicy)), (!cast(Instr#"_IMM_ci") $sbase, $offset, (extract_glc $cachepolicy), (extract_dlc $cachepolicy))> { let OtherPredicates = [isGFX7Only]; + let AddedComplexity = 1; } // 3. Offset loaded in an 32bit SGPR