Skip to content

Commit 661666d

Browse files
authored
[AMDGPU] Move renamedInGFX9 from TableGen to SIInstrInfo helper function/macro to free up a bit slot (#82787)
Follow on to #81525 and #81901 in the series of consolidating bits in TSFlags. Remove renamedInGFX9 from SIInstrFormats.td and move to helper function/macro in SIInstrInfo. renamedInGFX9 points to V_{add, sub, subrev, addc, subb, subbrev}_ U32 and V_{div_fixup_F16, fma_F16, interp_p2_F16, mad_F16, mad_U16, mad_I16}.
1 parent 0813c76 commit 661666d

File tree

4 files changed

+88
-84
lines changed

4 files changed

+88
-84
lines changed

llvm/lib/Target/AMDGPU/SIInstrFormats.td

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@ class InstSI <dag outs, dag ins, string asm = "",
8484
// Is it possible for this instruction to be atomic?
8585
field bit maybeAtomic = 1;
8686

87-
// This bit indicates that this is a VI instruction which is renamed
88-
// in GFX9. Required for correct mapping from pseudo to MC.
89-
field bit renamedInGFX9 = 0;
90-
9187
// This bit indicates that this has a floating point result type, so
9288
// the clamp modifier has floating point semantics.
9389
field bit FPClamp = 0;
@@ -214,7 +210,9 @@ class InstSI <dag outs, dag ins, string asm = "",
214210
let TSFlags{42} = VOP3_OPSEL;
215211

216212
let TSFlags{43} = maybeAtomic;
217-
let TSFlags{44} = renamedInGFX9;
213+
214+
// Reserved, must be 0.
215+
let TSFlags{44} = 0;
218216

219217
let TSFlags{45} = FPClamp;
220218
let TSFlags{46} = IntClamp;

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9189,13 +9189,43 @@ bool SIInstrInfo::isAsmOnlyOpcode(int MCOp) const {
91899189
}
91909190
}
91919191

9192+
#define GENERATE_RENAMED_GFX9_CASES(OPCODE) \
9193+
case OPCODE##_dpp: \
9194+
case OPCODE##_e32: \
9195+
case OPCODE##_e64: \
9196+
case OPCODE##_e64_dpp: \
9197+
case OPCODE##_sdwa:
9198+
9199+
static bool isRenamedInGFX9(int Opcode) {
9200+
switch (Opcode) {
9201+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_ADDC_U32)
9202+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_ADD_CO_U32)
9203+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_ADD_U32)
9204+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUBBREV_U32)
9205+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUBB_U32)
9206+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUBREV_CO_U32)
9207+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUBREV_U32)
9208+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUB_CO_U32)
9209+
GENERATE_RENAMED_GFX9_CASES(AMDGPU::V_SUB_U32)
9210+
//
9211+
case AMDGPU::V_DIV_FIXUP_F16_gfx9_e64:
9212+
case AMDGPU::V_FMA_F16_gfx9_e64:
9213+
case AMDGPU::V_INTERP_P2_F16:
9214+
case AMDGPU::V_MAD_F16_e64:
9215+
case AMDGPU::V_MAD_U16_e64:
9216+
case AMDGPU::V_MAD_I16_e64:
9217+
return true;
9218+
default:
9219+
return false;
9220+
}
9221+
}
9222+
91929223
int SIInstrInfo::pseudoToMCOpcode(int Opcode) const {
91939224
Opcode = SIInstrInfo::getNonSoftWaitcntOpcode(Opcode);
91949225

91959226
unsigned Gen = subtargetEncodingFamily(ST);
91969227

9197-
if ((get(Opcode).TSFlags & SIInstrFlags::renamedInGFX9) != 0 &&
9198-
ST.getGeneration() == AMDGPUSubtarget::GFX9)
9228+
if (ST.getGeneration() == AMDGPUSubtarget::GFX9 && isRenamedInGFX9(Opcode))
91999229
Gen = SIEncodingFamily::GFX9;
92009230

92019231
// Adjust the encoding family to GFX80 for D16 buffer instructions when the

llvm/lib/Target/AMDGPU/VOP2Instructions.td

Lines changed: 33 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -142,72 +142,59 @@ class getVOP2Pat64 <SDPatternOperator node, VOPProfile P> : LetDummies {
142142
multiclass VOP2Inst_e32<string opName,
143143
VOPProfile P,
144144
SDPatternOperator node = null_frag,
145-
string revOp = opName,
146-
bit GFX9Renamed = 0> {
147-
let renamedInGFX9 = GFX9Renamed in {
145+
string revOp = opName> {
148146
def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>,
149147
Commutable_REV<revOp#"_e32", !eq(revOp, opName)>;
150-
} // End renamedInGFX9 = GFX9Renamed
151148
}
152149
multiclass
153150
VOP2Inst_e32_VOPD<string opName, VOPProfile P, bits<5> VOPDOp,
154151
string VOPDName, SDPatternOperator node = null_frag,
155-
string revOp = opName, bit GFX9Renamed = 0> {
156-
defm NAME : VOP2Inst_e32<opName, P, node, revOp, GFX9Renamed>,
152+
string revOp = opName> {
153+
defm NAME : VOP2Inst_e32<opName, P, node, revOp>,
157154
VOPD_Component<VOPDOp, VOPDName>;
158155
}
159156
multiclass VOP2Inst_e64<string opName,
160157
VOPProfile P,
161158
SDPatternOperator node = null_frag,
162-
string revOp = opName,
163-
bit GFX9Renamed = 0> {
164-
let renamedInGFX9 = GFX9Renamed in {
159+
string revOp = opName> {
165160
def _e64 : VOP3InstBase <opName, P, node, 1>,
166161
Commutable_REV<revOp#"_e64", !eq(revOp, opName)>;
167162

168163
let SubtargetPredicate = isGFX11Plus in {
169164
if P.HasExtVOP3DPP then
170165
def _e64_dpp : VOP3_DPP_Pseudo <opName, P>;
171166
} // End SubtargetPredicate = isGFX11Plus
172-
} // End renamedInGFX9 = GFX9Renamed
173167
}
174168

175169
multiclass VOP2Inst_sdwa<string opName,
176-
VOPProfile P,
177-
bit GFX9Renamed = 0> {
178-
let renamedInGFX9 = GFX9Renamed in {
170+
VOPProfile P> {
179171
if P.HasExtSDWA then
180172
def _sdwa : VOP2_SDWA_Pseudo <opName, P>;
181-
} // End renamedInGFX9 = GFX9Renamed
182173
}
183174

184175
multiclass VOP2Inst<string opName,
185176
VOPProfile P,
186177
SDPatternOperator node = null_frag,
187-
string revOp = opName,
188-
bit GFX9Renamed = 0> :
189-
VOP2Inst_e32<opName, P, node, revOp, GFX9Renamed>,
190-
VOP2Inst_e64<opName, P, node, revOp, GFX9Renamed>,
191-
VOP2Inst_sdwa<opName, P, GFX9Renamed> {
192-
let renamedInGFX9 = GFX9Renamed in {
178+
string revOp = opName> :
179+
VOP2Inst_e32<opName, P, node, revOp>,
180+
VOP2Inst_e64<opName, P, node, revOp>,
181+
VOP2Inst_sdwa<opName, P> {
193182
if P.HasExtDPP then
194183
def _dpp : VOP2_DPP_Pseudo <opName, P>;
195-
}
196184
}
197185

198186
multiclass VOP2Inst_t16<string opName,
199187
VOPProfile P,
200188
SDPatternOperator node = null_frag,
201-
string revOp = opName,
202-
bit GFX9Renamed = 0> {
189+
string revOp = opName> {
203190
let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
204-
defm NAME : VOP2Inst<opName, P, node, revOp, GFX9Renamed>;
191+
defm NAME : VOP2Inst<opName, P, node, revOp>;
205192
}
206193
let SubtargetPredicate = UseRealTrue16Insts in {
207-
defm _t16 : VOP2Inst<opName#"_t16", VOPProfile_True16<P>, node, revOp#"_t16", GFX9Renamed>;
194+
defm _t16 : VOP2Inst<opName#"_t16", VOPProfile_True16<P>, node, revOp#"_t16">;
208195
}
209196
let SubtargetPredicate = UseFakeTrue16Insts in {
210-
defm _fake16 : VOP2Inst<opName#"_fake16", VOPProfile_Fake16<P>, node, revOp#"_fake16", GFX9Renamed>;
197+
defm _fake16 : VOP2Inst<opName#"_fake16", VOPProfile_Fake16<P>, node, revOp#"_fake16">;
211198
}
212199
}
213200

@@ -218,13 +205,12 @@ multiclass VOP2Inst_t16<string opName,
218205
multiclass VOP2Inst_e64_t16<string opName,
219206
VOPProfile P,
220207
SDPatternOperator node = null_frag,
221-
string revOp = opName,
222-
bit GFX9Renamed = 0> {
208+
string revOp = opName> {
223209
let OtherPredicates = [Has16BitInsts], True16Predicate = NotHasTrue16BitInsts in {
224-
defm NAME : VOP2Inst<opName, P, node, revOp, GFX9Renamed>;
210+
defm NAME : VOP2Inst<opName, P, node, revOp>;
225211
}
226212
let SubtargetPredicate = HasTrue16BitInsts in {
227-
defm _t16 : VOP2Inst_e64<opName#"_t16", VOPProfile_Fake16<P>, node, revOp#"_t16", GFX9Renamed>;
213+
defm _t16 : VOP2Inst_e64<opName#"_t16", VOPProfile_Fake16<P>, node, revOp#"_t16">;
228214
}
229215
}
230216

@@ -233,24 +219,19 @@ multiclass VOP2Inst_VOPD<string opName,
233219
bits<5> VOPDOp,
234220
string VOPDName,
235221
SDPatternOperator node = null_frag,
236-
string revOp = opName,
237-
bit GFX9Renamed = 0> :
238-
VOP2Inst_e32_VOPD<opName, P, VOPDOp, VOPDName, node, revOp, GFX9Renamed>,
239-
VOP2Inst_e64<opName, P, node, revOp, GFX9Renamed>,
240-
VOP2Inst_sdwa<opName, P, GFX9Renamed> {
241-
let renamedInGFX9 = GFX9Renamed in {
222+
string revOp = opName> :
223+
VOP2Inst_e32_VOPD<opName, P, VOPDOp, VOPDName, node, revOp>,
224+
VOP2Inst_e64<opName, P, node, revOp>,
225+
VOP2Inst_sdwa<opName, P> {
242226
if P.HasExtDPP then
243227
def _dpp : VOP2_DPP_Pseudo <opName, P>;
244-
}
245228
}
246229

247230
multiclass VOP2bInst <string opName,
248231
VOPProfile P,
249232
SDPatternOperator node = null_frag,
250233
string revOp = opName,
251-
bit GFX9Renamed = 0,
252234
bit useSGPRInput = !eq(P.NumSrcArgs, 3)> {
253-
let renamedInGFX9 = GFX9Renamed in {
254235
let SchedRW = [Write32Bit, WriteSALU] in {
255236
let Uses = !if(useSGPRInput, [VCC, EXEC], [EXEC]), Defs = [VCC] in {
256237
def _e32 : VOP2_Pseudo <opName, P, VOPPatOrNull<node,P>.ret>,
@@ -274,7 +255,6 @@ multiclass VOP2bInst <string opName,
274255
def _e64_dpp : VOP3_DPP_Pseudo <opName, P>;
275256
} // End SubtargetPredicate = isGFX11Plus
276257
}
277-
}
278258
}
279259

280260
class VOP2bInstAlias <VOP2_Pseudo ps, Instruction inst,
@@ -763,26 +743,24 @@ def V_MADAK_F32 : VOP2_Pseudo <"v_madak_f32", VOP_MADAK_F32, []>;
763743

764744
// No patterns so that the scalar instructions are always selected.
765745
// The scalar versions will be replaced with vector when needed later.
746+
defm V_SUB_CO_U32 : VOP2bInst <"v_sub_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32">;
747+
defm V_SUBREV_CO_U32 : VOP2bInst <"v_subrev_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32">;
748+
defm V_SUBB_U32 : VOP2bInst <"v_subb_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32">;
749+
defm V_SUBBREV_U32 : VOP2bInst <"v_subbrev_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32">;
766750

767-
let isAdd = 1 in {
768-
defm V_ADD_CO_U32 : VOP2bInst <"v_add_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_add_co_u32", 1>;
769-
}
770-
771-
defm V_SUB_CO_U32 : VOP2bInst <"v_sub_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32", 1>;
772-
defm V_SUBREV_CO_U32 : VOP2bInst <"v_subrev_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_sub_co_u32", 1>;
773-
defm V_ADDC_U32 : VOP2bInst <"v_addc_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_addc_u32", 1>;
774-
defm V_SUBB_U32 : VOP2bInst <"v_subb_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>;
775-
defm V_SUBBREV_U32 : VOP2bInst <"v_subbrev_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_subb_u32", 1>;
776751

752+
let SubtargetPredicate = HasAddNoCarryInsts, isReMaterializable = 1 in {
753+
defm V_SUB_U32 : VOP2Inst <"v_sub_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32">;
754+
defm V_SUBREV_U32 : VOP2Inst <"v_subrev_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32">;
755+
}
777756

778-
let SubtargetPredicate = HasAddNoCarryInsts, isReMaterializable = 1 in {
779-
780-
let isAdd = 1 in {
781-
defm V_ADD_U32 : VOP2Inst_VOPD <"v_add_u32", VOP_I32_I32_I32_ARITH, 0x10, "v_add_nc_u32", null_frag, "v_add_u32", 1>;
757+
let SubtargetPredicate = HasAddNoCarryInsts, isReMaterializable = 1, isAdd = 1 in {
758+
defm V_ADD_U32 : VOP2Inst_VOPD <"v_add_u32", VOP_I32_I32_I32_ARITH, 0x10, "v_add_nc_u32", null_frag, "v_add_u32">;
782759
}
783760

784-
defm V_SUB_U32 : VOP2Inst <"v_sub_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>;
785-
defm V_SUBREV_U32 : VOP2Inst <"v_subrev_u32", VOP_I32_I32_I32_ARITH, null_frag, "v_sub_u32", 1>;
761+
let isAdd = 1 in {
762+
defm V_ADD_CO_U32 : VOP2bInst <"v_add_co_u32", VOP2b_I32_I1_I32_I32, null_frag, "v_add_co_u32">;
763+
defm V_ADDC_U32 : VOP2bInst <"v_addc_u32", VOP2b_I32_I1_I32_I32_I1, null_frag, "v_addc_u32">;
786764
}
787765

788766
} // End isCommutable = 1

llvm/lib/Target/AMDGPU/VOP3Instructions.td

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -335,35 +335,33 @@ let FPDPRounding = 1 in {
335335
defm V_FMA_F16 : VOP3Inst <"v_fma_f16", VOP3_Profile<VOP_F16_F16_F16_F16>, any_fma>;
336336
} // End Predicates = [Has16BitInsts, isGFX8Only]
337337

338-
let renamedInGFX9 = 1, SubtargetPredicate = isGFX9Plus in {
338+
let SubtargetPredicate = isGFX9Plus in {
339339
defm V_DIV_FIXUP_F16_gfx9 : VOP3Inst <"v_div_fixup_f16_gfx9",
340340
VOP3_Profile<VOP_F16_F16_F16_F16, VOP3_OPSEL>, AMDGPUdiv_fixup>;
341341
defm V_FMA_F16_gfx9 : VOP3Inst <"v_fma_f16_gfx9", VOP3_Profile<VOP_F16_F16_F16_F16, VOP3_OPSEL>, any_fma>;
342-
} // End renamedInGFX9 = 1, SubtargetPredicate = isGFX9Plus
342+
} // End SubtargetPredicate = isGFX9Plus
343343
} // End FPDPRounding = 1
344344

345345
let SubtargetPredicate = Has16BitInsts, isCommutable = 1 in {
346346

347-
let renamedInGFX9 = 1 in {
348-
defm V_MAD_U16 : VOP3Inst <"v_mad_u16", VOP3_Profile<VOP_I16_I16_I16_I16, VOP3_CLAMP>>;
349-
defm V_MAD_I16 : VOP3Inst <"v_mad_i16", VOP3_Profile<VOP_I16_I16_I16_I16, VOP3_CLAMP>>;
350-
let FPDPRounding = 1 in {
351-
defm V_MAD_F16 : VOP3Inst <"v_mad_f16", VOP3_Profile<VOP_F16_F16_F16_F16>, any_fmad>;
352-
let Uses = [MODE, M0, EXEC] in {
353-
let OtherPredicates = [isNotGFX90APlus] in
354-
// For some reason the intrinsic operands are in a different order
355-
// from the instruction operands.
356-
def V_INTERP_P2_F16 : VOP3Interp <"v_interp_p2_f16", VOP3_INTERP16<[f16, f32, i32, f32]>,
357-
[(set f16:$vdst,
358-
(int_amdgcn_interp_p2_f16 (VOP3Mods f32:$src2, i32:$src2_modifiers),
359-
(VOP3Mods f32:$src0, i32:$src0_modifiers),
360-
(i32 timm:$attrchan),
361-
(i32 timm:$attr),
362-
(i1 timm:$high),
363-
M0))]>;
364-
} // End Uses = [M0, MODE, EXEC]
365-
} // End FPDPRounding = 1
366-
} // End renamedInGFX9 = 1
347+
defm V_MAD_U16 : VOP3Inst <"v_mad_u16", VOP3_Profile<VOP_I16_I16_I16_I16, VOP3_CLAMP>>;
348+
defm V_MAD_I16 : VOP3Inst <"v_mad_i16", VOP3_Profile<VOP_I16_I16_I16_I16, VOP3_CLAMP>>;
349+
let FPDPRounding = 1 in {
350+
defm V_MAD_F16 : VOP3Inst <"v_mad_f16", VOP3_Profile<VOP_F16_F16_F16_F16>, any_fmad>;
351+
let Uses = [MODE, M0, EXEC] in {
352+
let OtherPredicates = [isNotGFX90APlus] in
353+
// For some reason the intrinsic operands are in a different order
354+
// from the instruction operands.
355+
def V_INTERP_P2_F16 : VOP3Interp <"v_interp_p2_f16", VOP3_INTERP16<[f16, f32, i32, f32]>,
356+
[(set f16:$vdst,
357+
(int_amdgcn_interp_p2_f16 (VOP3Mods f32:$src2, i32:$src2_modifiers),
358+
(VOP3Mods f32:$src0, i32:$src0_modifiers),
359+
(i32 timm:$attrchan),
360+
(i32 timm:$attr),
361+
(i1 timm:$high),
362+
M0))]>;
363+
} // End Uses = [M0, MODE, EXEC]
364+
} // End FPDPRounding = 1
367365

368366
let SubtargetPredicate = isGFX9Only, FPDPRounding = 1 in {
369367
defm V_MAD_F16_gfx9 : VOP3Inst <"v_mad_f16_gfx9", VOP3_Profile<VOP_F16_F16_F16_F16, VOP3_OPSEL>> ;

0 commit comments

Comments
 (0)