Skip to content

Commit b1d5a2a

Browse files
authored
[AMDGPU] Add regbankselect rules for G_ADD/SUB and variants (#159860)
Add legalization rules for G_ADD, G_UADDO, G_UADDE and their SUB counterparts.
1 parent 521fb93 commit b1d5a2a

12 files changed

+2218
-24
lines changed

llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeHelper.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,16 @@ void RegBankLegalizeHelper::lowerUnpackMinMax(MachineInstr &MI) {
500500
MI.eraseFromParent();
501501
}
502502

503+
void RegBankLegalizeHelper::lowerUnpackAExt(MachineInstr &MI) {
504+
auto [Op1Lo, Op1Hi] = unpackAExt(MI.getOperand(1).getReg());
505+
auto [Op2Lo, Op2Hi] = unpackAExt(MI.getOperand(2).getReg());
506+
auto ResLo = B.buildInstr(MI.getOpcode(), {SgprRB_S32}, {Op1Lo, Op2Lo});
507+
auto ResHi = B.buildInstr(MI.getOpcode(), {SgprRB_S32}, {Op1Hi, Op2Hi});
508+
B.buildBuildVectorTrunc(MI.getOperand(0).getReg(),
509+
{ResLo.getReg(0), ResHi.getReg(0)});
510+
MI.eraseFromParent();
511+
}
512+
503513
static bool isSignedBFE(MachineInstr &MI) {
504514
if (GIntrinsic *GI = dyn_cast<GIntrinsic>(&MI))
505515
return (GI->is(Intrinsic::amdgcn_sbfe));
@@ -804,6 +814,8 @@ void RegBankLegalizeHelper::lower(MachineInstr &MI,
804814
}
805815
break;
806816
}
817+
case UnpackAExt:
818+
return lowerUnpackAExt(MI);
807819
case WidenMMOToS32:
808820
return widenMMOToS32(cast<GAnyLoad>(MI));
809821
}
@@ -1120,7 +1132,8 @@ void RegBankLegalizeHelper::applyMappingDst(
11201132
assert(RB == SgprRB);
11211133
Register NewDst = MRI.createVirtualRegister(SgprRB_S32);
11221134
Op.setReg(NewDst);
1123-
B.buildTrunc(Reg, NewDst);
1135+
if (!MRI.use_empty(Reg))
1136+
B.buildTrunc(Reg, NewDst);
11241137
break;
11251138
}
11261139
case InvalidMapping: {

llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeHelper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class RegBankLegalizeHelper {
124124
void lowerSplitTo32Select(MachineInstr &MI);
125125
void lowerSplitTo32SExtInReg(MachineInstr &MI);
126126
void lowerUnpackMinMax(MachineInstr &MI);
127+
void lowerUnpackAExt(MachineInstr &MI);
127128
};
128129

129130
} // end namespace AMDGPU

llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,19 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
470470
.Uni(S16, {{Sgpr32Trunc}, {Sgpr32AExt, Sgpr32AExt}})
471471
.Div(S16, {{Vgpr16}, {Vgpr16, Vgpr16}})
472472
.Uni(S32, {{Sgpr32}, {Sgpr32, Sgpr32}})
473-
.Div(S32, {{Vgpr32}, {Vgpr32, Vgpr32}});
473+
.Div(S32, {{Vgpr32}, {Vgpr32, Vgpr32}})
474+
.Uni(V2S16, {{SgprV2S16}, {SgprV2S16, SgprV2S16}, UnpackAExt})
475+
.Div(V2S16, {{VgprV2S16}, {VgprV2S16, VgprV2S16}})
476+
.Uni(S64, {{Sgpr64}, {Sgpr64, Sgpr64}})
477+
.Div(S64, {{Vgpr64}, {Vgpr64, Vgpr64}});
478+
479+
addRulesForGOpcs({G_UADDO, G_USUBO}, Standard)
480+
.Uni(S32, {{Sgpr32, Sgpr32Trunc}, {Sgpr32, Sgpr32}})
481+
.Div(S32, {{Vgpr32, Vcc}, {Vgpr32, Vgpr32}});
482+
483+
addRulesForGOpcs({G_UADDE, G_USUBE}, Standard)
484+
.Uni(S32, {{Sgpr32, Sgpr32Trunc}, {Sgpr32, Sgpr32, Sgpr32AExtBoolInReg}})
485+
.Div(S32, {{Vgpr32, Vcc}, {Vgpr32, Vgpr32, Vcc}});
474486

475487
addRulesForGOpcs({G_MUL}, Standard).Div(S32, {{Vgpr32}, {Vgpr32, Vgpr32}});
476488

llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ enum LoweringMethodID {
223223
UniCstExt,
224224
SplitLoad,
225225
WidenLoad,
226-
WidenMMOToS32
226+
WidenMMOToS32,
227+
UnpackAExt
227228
};
228229

229230
enum FastRulesTypes {

0 commit comments

Comments
 (0)