diff --git a/llvm/lib/Target/AMDGPU/SMInstructions.td b/llvm/lib/Target/AMDGPU/SMInstructions.td --- a/llvm/lib/Target/AMDGPU/SMInstructions.td +++ b/llvm/lib/Target/AMDGPU/SMInstructions.td @@ -831,38 +831,42 @@ def SMRDBufferSgprImm : ComplexPattern; multiclass SMRD_Pattern { - - // 1. IMM offset - def : GCNPat < - (smrd_load (SMRDImm i64:$sbase, i32:$offset)), - (vt (!cast(Instr#"_IMM") $sbase, $offset, 0)) - >; - - // 2. 32-bit IMM offset on CI - def : GCNPat < - (smrd_load (SMRDImm32 i64:$sbase, i32:$offset)), - (vt (!cast(Instr#"_IMM_ci") $sbase, $offset, 0))> { - let OtherPredicates = [isGFX7Only]; - } - - // 3. SGPR offset - def : GCNPat < - (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)), - (vt (!cast(Instr#"_SGPR") $sbase, $soffset, 0)) - >; - - // 4. SGPR+IMM offset - def : GCNPat < - (smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)), - (vt (!cast(Instr#"_SGPR_IMM") $sbase, $soffset, $offset, 0))> { - let OtherPredicates = [isGFX9Plus]; - } - - // 5. No offset - def : GCNPat < - (vt (smrd_load (i64 SReg_64:$sbase))), - (vt (!cast(Instr#"_IMM") i64:$sbase, 0, 0)) - >; + // Global and constant loads can be selected to either MUBUF or SMRD + // instructions, but SMRD instructions are faster so we want the instruction + // selector to prefer those. + let AddedComplexity = 100 in { + // 1. IMM offset + def : GCNPat < + (smrd_load (SMRDImm i64:$sbase, i32:$offset)), + (vt (!cast(Instr#"_IMM") $sbase, $offset, 0)) + >; + + // 2. 32-bit IMM offset on CI + def : GCNPat < + (smrd_load (SMRDImm32 i64:$sbase, i32:$offset)), + (vt (!cast(Instr#"_IMM_ci") $sbase, $offset, 0))> { + let OtherPredicates = [isGFX7Only]; + } + + // 3. SGPR offset + def : GCNPat < + (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)), + (vt (!cast(Instr#"_SGPR") $sbase, $soffset, 0)) + >; + + // 4. SGPR+IMM offset + def : GCNPat < + (smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)), + (vt (!cast(Instr#"_SGPR_IMM") $sbase, $soffset, $offset, 0))> { + let OtherPredicates = [isGFX9Plus]; + } + + // 5. No offset + def : GCNPat < + (vt (smrd_load (i64 SReg_64:$sbase))), + (vt (!cast(Instr#"_IMM") i64:$sbase, 0, 0)) + >; + } // End let AddedComplexity = 100 } multiclass SMLoad_Pattern { @@ -898,11 +902,6 @@ } } -// Global and constant loads can be selected to either MUBUF or SMRD -// instructions, but SMRD instructions are faster so we want the instruction -// selector to prefer those. -let AddedComplexity = 100 in { - foreach vt = Reg32Types.types in { defm : SMRD_Pattern <"S_LOAD_DWORD", vt>; } @@ -934,7 +933,6 @@ defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX4", v4f32>; defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX8", v8f32>; defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX16", v16f32>; -} // End let AddedComplexity = 100 let OtherPredicates = [HasSMemTimeInst] in { def : GCNPat <