Skip to content

Commit 76c0214

Browse files
arsenmPravin Jagtap
authored andcommitted
AMDGPU: Copy correct predicates for SDWA reals (llvm#116288)
There are a lot of messes in the special case predicate handling. Currently broad let blocks override specific predicates with more general cases. For instructions with SDWA, the HasSDWA predicate was overriding the SubtargetPredicate for the instruction. This fixes enough to properly disallow new instructions that support SDWA on older targets. Change-Id: I79bdf0a0ca7ce13d9a972e9934b9fcc7702a2fba
1 parent 9a26ec7 commit 76c0214

File tree

5 files changed

+22
-19
lines changed

5 files changed

+22
-19
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2086,8 +2086,10 @@ def NotHasMinMaxDenormModes : Predicate<"!Subtarget->supportsMinMaxDenormModes()
20862086

20872087
def HasFminFmaxLegacy : Predicate<"Subtarget->hasFminFmaxLegacy()">;
20882088

2089-
def HasSDWA : Predicate<"Subtarget->hasSDWA()">,
2090-
AssemblerPredicate<(all_of FeatureSDWA, FeatureVolcanicIslands)>;
2089+
def HasSDWA : Predicate<"Subtarget->hasSDWA()">;
2090+
2091+
def HasSDWA8 : Predicate<"Subtarget->hasSDWA()">,
2092+
AssemblerPredicate<(all_of (not FeatureGFX9Insts), FeatureSDWA)>;
20912093

20922094
def HasSDWA9 :
20932095
Predicate<"Subtarget->hasSDWA()">,

llvm/lib/Target/AMDGPU/VOP1Instructions.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ multiclass VOP1_Real_vi <bits<10> op> {
12431243

12441244
if !cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA then
12451245
def _sdwa_vi :
1246-
VOP_SDWA_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>,
1246+
VOP_SDWA8_Real <!cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa")>,
12471247
VOP1_SDWAe <op{7-0}, !cast<VOP1_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
12481248

12491249
if !cast<VOP1_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9 then
@@ -1413,7 +1413,7 @@ def : GCNPat <
14131413
// GFX9
14141414
//===----------------------------------------------------------------------===//
14151415

1416-
let AssemblerPredicate = isGFX9Only, DecoderNamespace = "GFX9" in {
1416+
let DecoderNamespace = "GFX9" in {
14171417
multiclass VOP1_Real_gfx9 <bits<10> op> {
14181418
defm NAME : VOP1_Real_e32e64_vi <op>;
14191419

llvm/lib/Target/AMDGPU/VOP2Instructions.td

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,10 +2248,10 @@ multiclass Base_VOP2_Real_e32e64_vi <bits<6> op> :
22482248

22492249
} // End AssemblerPredicate = isGFX8GFX9, DecoderNamespace = "GFX8"
22502250

2251-
multiclass VOP2_SDWA_Real <bits<6> op> {
2251+
multiclass VOP2_SDWA8_Real <bits<6> op> {
22522252
if !cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA then
22532253
def _sdwa_vi :
2254-
VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>,
2254+
VOP_SDWA8_Real <!cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa")>,
22552255
VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
22562256
}
22572257

@@ -2279,7 +2279,7 @@ multiclass VOP2be_Real_e32e64_vi_only <bits<6> op, string OpName, string AsmName
22792279
}
22802280
if !cast<VOP2_Pseudo>(OpName#"_e32").Pfl.HasExtSDWA then
22812281
def _sdwa_vi :
2282-
VOP_SDWA_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>,
2282+
VOP_SDWA8_Real <!cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa")>,
22832283
VOP2_SDWAe <op{5-0}, !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa").Pfl> {
22842284
VOP2_SDWA_Pseudo ps = !cast<VOP2_SDWA_Pseudo>(OpName#"_sdwa");
22852285
let AsmString = AsmName # ps.AsmOperands;
@@ -2295,7 +2295,7 @@ multiclass VOP2be_Real_e32e64_vi_only <bits<6> op, string OpName, string AsmName
22952295

22962296
} // End AssemblerPredicate = isGFX8Only, DecoderNamespace = "GFX8"
22972297

2298-
let AssemblerPredicate = isGFX9Only, DecoderNamespace = "GFX9" in {
2298+
let DecoderNamespace = "GFX9" in {
22992299

23002300
multiclass VOP2be_Real_e32e64_gfx9 <bits<6> op, string OpName, string AsmName> {
23012301
def _e32_gfx9 :
@@ -2344,10 +2344,10 @@ multiclass VOP2_Real_e32e64_gfx9 <bits<6> op> {
23442344
VOP2_DPPe<op, !cast<VOP2_DPP_Pseudo>(NAME#"_dpp")>;
23452345
}
23462346

2347-
} // End AssemblerPredicate = isGFX9Only, DecoderNamespace = "GFX9"
2347+
} // End DecoderNamespace = "GFX9"
23482348

23492349
multiclass VOP2_Real_e32e64_vi <bits<6> op> :
2350-
Base_VOP2_Real_e32e64_vi<op>, VOP2_SDWA_Real<op>, VOP2_SDWA9_Real<op> {
2350+
Base_VOP2_Real_e32e64_vi<op>, VOP2_SDWA8_Real<op>, VOP2_SDWA9_Real<op> {
23512351

23522352
if !cast<VOP2_Pseudo>(NAME#"_e32").Pfl.HasExtDPP then
23532353
def _dpp_vi :
@@ -2359,7 +2359,7 @@ defm V_CNDMASK_B32 : VOP2_Real_e32e64_vi <0x0>;
23592359
defm V_ADD_F32 : VOP2_Real_e32e64_vi <0x1>;
23602360
defm V_SUB_F32 : VOP2_Real_e32e64_vi <0x2>;
23612361
defm V_SUBREV_F32 : VOP2_Real_e32e64_vi <0x3>;
2362-
let AssemblerPredicate = isGCN3ExcludingGFX90A in
2362+
let OtherPredicates = [isGCN3ExcludingGFX90A] in
23632363
defm V_MUL_LEGACY_F32 : VOP2_Real_e32e64_vi <0x4>;
23642364
defm V_MUL_F32 : VOP2_Real_e32e64_vi <0x5>;
23652365
defm V_MUL_I32_I24 : VOP2_Real_e32e64_vi <0x6>;
@@ -2389,6 +2389,7 @@ defm V_ADDC_U32 : VOP2be_Real_e32e64_vi_only <0x1c, "V_ADDC_U32", "
23892389
defm V_SUBB_U32 : VOP2be_Real_e32e64_vi_only <0x1d, "V_SUBB_U32", "v_subb_u32">;
23902390
defm V_SUBBREV_U32 : VOP2be_Real_e32e64_vi_only <0x1e, "V_SUBBREV_U32", "v_subbrev_u32">;
23912391

2392+
let AssemblerPredicate = isGFX9Only in {
23922393
defm V_ADD_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x19, "V_ADD_CO_U32", "v_add_co_u32">;
23932394
defm V_SUB_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1a, "V_SUB_CO_U32", "v_sub_co_u32">;
23942395
defm V_SUBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1b, "V_SUBREV_CO_U32", "v_subrev_co_u32">;
@@ -2399,6 +2400,7 @@ defm V_SUBBREV_CO_U32 : VOP2be_Real_e32e64_gfx9 <0x1e, "V_SUBBREV_U32", "v_s
23992400
defm V_ADD_U32 : VOP2_Real_e32e64_gfx9 <0x34>;
24002401
defm V_SUB_U32 : VOP2_Real_e32e64_gfx9 <0x35>;
24012402
defm V_SUBREV_U32 : VOP2_Real_e32e64_gfx9 <0x36>;
2403+
} // End AssemblerPredicate = isGFX9Only
24022404

24032405
defm V_BFM_B32 : VOP2_Real_e64only_vi <0x293>;
24042406
defm V_BCNT_U32_B32 : VOP2_Real_e64only_vi <0x28b>;
@@ -2476,7 +2478,7 @@ defm V_XNOR_B32 : VOP2_Real_e32e64_vi <0x3d>;
24762478

24772479
} // End SubtargetPredicate = HasDLInsts
24782480

2479-
let AssemblerPredicate = isGFX90APlus, DecoderNamespace = "GFX90A" in {
2481+
let DecoderNamespace = "GFX90A" in {
24802482
multiclass VOP2_Real_e32_gfx90a <bits<6> op> {
24812483
def _e32_gfx90a :
24822484
VOP2_Real<!cast<VOP2_Pseudo>(NAME#"_e32"), SIEncodingFamily.GFX90A>,
@@ -2509,7 +2511,7 @@ let SubtargetPredicate = HasFmacF64Inst in {
25092511
defm V_FMAC_F64 : VOP2_Real_e32e64_gfx90a <0x4>;
25102512
} // End SubtargetPredicate = HasFmacF64Inst
25112513

2512-
let SubtargetPredicate = isGFX90APlus, IsSingle = 1 in {
2514+
let IsSingle = 1 in {
25132515
defm V_MUL_LEGACY_F32 : VOP2_Real_e64_gfx90a <0x2a1>;
25142516
}
25152517

llvm/lib/Target/AMDGPU/VOPCInstructions.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2161,7 +2161,7 @@ multiclass VOPC_Real_vi <bits<10> op> {
21612161

21622162
if !cast<VOPC_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA then
21632163
def _sdwa_vi :
2164-
VOP_SDWA_Real <!cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa")>,
2164+
VOP_SDWA8_Real <!cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa")>,
21652165
VOPC_SDWAe <op{7-0}, !cast<VOPC_SDWA_Pseudo>(NAME#"_sdwa").Pfl>;
21662166

21672167
if !cast<VOPC_Pseudo>(NAME#"_e32").Pfl.HasExtSDWA9 then

llvm/lib/Target/AMDGPU/VOPInstructions.td

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -615,15 +615,14 @@ class VOP_SDWA_Pseudo <string opName, VOPProfile P, list<dag> pattern=[]> :
615615
let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]);
616616

617617
let SubtargetPredicate = HasSDWA;
618-
let AssemblerPredicate = HasSDWA;
619618
let AsmVariantName = !if(P.HasExtSDWA, AMDGPUAsmVariants.SDWA,
620619
AMDGPUAsmVariants.Disable);
621620
let DecoderNamespace = "GFX8";
622621

623622
VOPProfile Pfl = P;
624623
}
625624

626-
class VOP_SDWA_Real <VOP_SDWA_Pseudo ps> :
625+
class VOP_SDWA8_Real <VOP_SDWA_Pseudo ps> :
627626
InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>,
628627
SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SDWA> {
629628

@@ -641,7 +640,7 @@ class VOP_SDWA_Real <VOP_SDWA_Pseudo ps> :
641640

642641
// Copy relevant pseudo op flags
643642
let SubtargetPredicate = ps.SubtargetPredicate;
644-
let AssemblerPredicate = ps.AssemblerPredicate;
643+
let AssemblerPredicate = HasSDWA8;
645644
let AsmMatchConverter = ps.AsmMatchConverter;
646645
let AsmVariantName = ps.AsmVariantName;
647646
let UseNamedOperandTable = ps.UseNamedOperandTable;
@@ -672,7 +671,7 @@ class Base_VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> :
672671
let Constraints = ps.Constraints;
673672
let DisableEncoding = ps.DisableEncoding;
674673

675-
let SubtargetPredicate = HasSDWA9;
674+
let SubtargetPredicate = ps.SubtargetPredicate;
676675
let AssemblerPredicate = HasSDWA9;
677676
let OtherPredicates = ps.OtherPredicates;
678677
let AsmVariantName = !if(ps.Pfl.HasExtSDWA9, AMDGPUAsmVariants.SDWA9,
@@ -698,7 +697,7 @@ class VOP_SDWA9_Real <VOP_SDWA_Pseudo ps> :
698697
SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SDWA9>;
699698

700699
class Base_VOP_SDWA10_Real<VOP_SDWA_Pseudo ps> : Base_VOP_SDWA9_Real<ps> {
701-
let SubtargetPredicate = HasSDWA10;
700+
let SubtargetPredicate = ps.SubtargetPredicate;
702701
let AssemblerPredicate = HasSDWA10;
703702
let DecoderNamespace = "GFX10";
704703
}

0 commit comments

Comments
 (0)