Skip to content

Commit b9c7d60

Browse files
authored
AMDGPU: Start fixing inconsistencies in usage of SubtargetPredicate (#96337)
SubtargetPredicate should be the primary "does this instruction exist" predicate, with OtherPredicates used for other side pieces of information. Changes like 856d1c4 were backwards. The problematic usage is how GFX12 is using HasRestrictedOffset. The multiclasses for buffers should probably be split up instead of hiding OtherPredicates inside the buffer atomic multiclasses. The two cases are mutually exclusive and really need a negated predicate for the not-gfx12 case. It's pretty terrible we have to manage this in the first place. TableGen should be able to figure out the required predicates from any instructions that appear in the pattern output.
1 parent 5d6d2fc commit b9c7d60

File tree

1 file changed

+29
-37
lines changed

1 file changed

+29
-37
lines changed

llvm/lib/Target/AMDGPU/BUFInstructions.td

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ multiclass MUBUF_Pseudo_Load_Pats_Common<string BaseInst, ValueType load_vt = i3
532532
}
533533

534534
multiclass MUBUF_Pseudo_Load_Pats<string BaseInst, ValueType load_vt = i32, SDPatternOperator ld = null_frag>{
535-
let SubtargetPredicate = HasUnrestrictedSOffset in {
535+
let OtherPredicates = [HasUnrestrictedSOffset] in {
536536
defm : MUBUF_Pseudo_Load_Pats_Common<BaseInst, load_vt, ld>;
537537
}
538538
defm : MUBUF_Pseudo_Load_Pats_Common<BaseInst # "_VBUFFER", load_vt, ld>;
@@ -629,7 +629,7 @@ multiclass MUBUF_Pseudo_Store_Pats_Common<string BaseInst, ValueType store_vt =
629629
}
630630

631631
multiclass MUBUF_Pseudo_Store_Pats<string BaseInst, ValueType store_vt = i32, SDPatternOperator st = null_frag> {
632-
let SubtargetPredicate = HasUnrestrictedSOffset in {
632+
let OtherPredicates = [HasUnrestrictedSOffset] in {
633633
defm : MUBUF_Pseudo_Store_Pats_Common<BaseInst, store_vt, st>;
634634
}
635635
defm : MUBUF_Pseudo_Store_Pats_Common<BaseInst # "_VBUFFER", store_vt, st>;
@@ -1227,12 +1227,12 @@ defm BUFFER_ATOMIC_PK_ADD_F16 : MUBUF_Pseudo_Atomics_NO_RTN <
12271227
"buffer_atomic_pk_add_f16", VGPR_32, v2f16
12281228
>;
12291229

1230-
let OtherPredicates = [HasAtomicFaddRtnInsts] in
1230+
let SubtargetPredicate = HasAtomicFaddRtnInsts in
12311231
defm BUFFER_ATOMIC_ADD_F32 : MUBUF_Pseudo_Atomics_RTN<
12321232
"buffer_atomic_add_f32", VGPR_32, f32, null_frag
12331233
>;
12341234

1235-
let OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in
1235+
let SubtargetPredicate = HasAtomicBufferGlobalPkAddF16Insts in
12361236
defm BUFFER_ATOMIC_PK_ADD_F16 : MUBUF_Pseudo_Atomics_RTN <
12371237
"buffer_atomic_pk_add_f16", VGPR_32, v2f16, null_frag
12381238
>;
@@ -1699,9 +1699,11 @@ multiclass SIBufferAtomicPat_Common<string OpPrefix, ValueType vt, string Inst,
16991699

17001700
multiclass SIBufferAtomicPat<string OpPrefix, ValueType vt, string Inst,
17011701
list<string> RtnModes = ["ret", "noret"]> {
1702-
let SubtargetPredicate = HasUnrestrictedSOffset in {
1702+
let OtherPredicates = [HasUnrestrictedSOffset] in {
17031703
defm : SIBufferAtomicPat_Common<OpPrefix, vt, Inst, RtnModes>;
17041704
}
1705+
1706+
// FIXME: This needs a !HasUnrestrictedSOffset predicate
17051707
defm : SIBufferAtomicPat_Common<OpPrefix, vt, Inst # "_VBUFFER", RtnModes>;
17061708
}
17071709

@@ -1732,18 +1734,19 @@ defm : SIBufferAtomicPat<"SIbuffer_atomic_xor", i64, "BUFFER_ATOMIC_XOR_X2">;
17321734
defm : SIBufferAtomicPat<"SIbuffer_atomic_inc", i64, "BUFFER_ATOMIC_INC_X2">;
17331735
defm : SIBufferAtomicPat<"SIbuffer_atomic_dec", i64, "BUFFER_ATOMIC_DEC_X2">;
17341736

1735-
let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
1737+
let SubtargetPredicate = HasAtomicCSubNoRtnInsts in
17361738
defm : SIBufferAtomicPat<"SIbuffer_atomic_csub", i32, "BUFFER_ATOMIC_CSUB", ["noret"]>;
17371739

17381740
let SubtargetPredicate = isGFX12Plus in {
17391741
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_fadd", v2bf16, "BUFFER_ATOMIC_PK_ADD_BF16_VBUFFER">;
17401742
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_cond_sub_u32", i32, "BUFFER_ATOMIC_COND_SUB_U32_VBUFFER", ["ret"]>;
1743+
}
17411744

1742-
let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
1743-
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_cond_sub_u32", i32, "BUFFER_ATOMIC_COND_SUB_U32_VBUFFER", ["noret"]>;
1745+
let SubtargetPredicate = HasAtomicCSubNoRtnInsts in {
1746+
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_cond_sub_u32", i32, "BUFFER_ATOMIC_COND_SUB_U32_VBUFFER", ["noret"]>;
17441747
}
17451748

1746-
let OtherPredicates = [isGFX6GFX7GFX10Plus] in {
1749+
let SubtargetPredicate = isGFX6GFX7GFX10Plus in {
17471750
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f32, "BUFFER_ATOMIC_FMIN">;
17481751
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f32, "BUFFER_ATOMIC_FMAX">;
17491752
}
@@ -1803,29 +1806,21 @@ multiclass BufferAtomicPatterns_NO_RTN<SDPatternOperator name, ValueType vt,
18031806
defm : BufferAtomicPatterns_NO_RTN_Common<name, vt, opcode # "_VBUFFER">;
18041807
}
18051808

1806-
let OtherPredicates = [HasAtomicFaddNoRtnInsts] in
1809+
let SubtargetPredicate = HasAtomicFaddNoRtnInsts in
18071810
defm : SIBufferAtomicPat<"SIbuffer_atomic_fadd", f32, "BUFFER_ATOMIC_ADD_F32", ["noret"]>;
18081811

1809-
let OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts] in {
1810-
let SubtargetPredicate = isGFX9Only in
1811-
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16", ["noret"]>;
1812-
1813-
let SubtargetPredicate = isGFX12Plus in
1814-
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16_VBUFFER", ["noret"]>;
1815-
} // End OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts]
1812+
let SubtargetPredicate = HasAtomicBufferGlobalPkAddF16NoRtnInsts in {
1813+
defm : SIBufferAtomicPat<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16", ["noret"]>;
1814+
} // End SubtargetPredicate = HasAtomicBufferGlobalPkAddF16NoRtnInsts
18161815

1817-
let OtherPredicates = [HasAtomicFaddRtnInsts] in
1816+
let SubtargetPredicate = HasAtomicFaddRtnInsts in
18181817
defm : SIBufferAtomicPat<"SIbuffer_atomic_fadd", f32, "BUFFER_ATOMIC_ADD_F32", ["ret"]>;
18191818

1820-
let OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in {
1821-
let SubtargetPredicate = isGFX9Only in
1822-
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16", ["ret"]>;
1823-
1824-
let SubtargetPredicate = isGFX12Plus in
1825-
defm : SIBufferAtomicPat_Common<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16_VBUFFER", ["ret"]>;
1826-
} // End OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts]
1819+
let SubtargetPredicate = HasAtomicBufferGlobalPkAddF16Insts in {
1820+
defm : SIBufferAtomicPat<"SIbuffer_atomic_fadd", v2f16, "BUFFER_ATOMIC_PK_ADD_F16", ["ret"]>;
1821+
} // End SubtargetPredicate = HasAtomicBufferGlobalPkAddF16Insts
18271822

1828-
let OtherPredicates = [HasBufferFlatGlobalAtomicsF64] in {
1823+
let SubtargetPredicate = HasBufferFlatGlobalAtomicsF64 in {
18291824
defm : SIBufferAtomicPat<"SIbuffer_atomic_fadd", f64, "BUFFER_ATOMIC_ADD_F64">;
18301825
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f64, "BUFFER_ATOMIC_MIN_F64">;
18311826
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_MAX_F64">;
@@ -1901,7 +1896,7 @@ multiclass SIBufferAtomicCmpSwapPat_Common<ValueType vt, ValueType data_vt, stri
19011896
}
19021897

19031898
multiclass SIBufferAtomicCmpSwapPat<ValueType vt, ValueType data_vt, string Inst> {
1904-
let SubtargetPredicate = HasUnrestrictedSOffset in {
1899+
let OtherPredicates = [HasUnrestrictedSOffset] in {
19051900
defm : SIBufferAtomicCmpSwapPat_Common<vt, data_vt, Inst>;
19061901
}
19071902
defm : SIBufferAtomicCmpSwapPat_Common<vt, data_vt, Inst # "_VBUFFER">;
@@ -1952,7 +1947,7 @@ multiclass MUBUFLoad_PatternOffset_Common <string Instr, ValueType vt,
19521947

19531948
multiclass MUBUFLoad_PatternOffset <string Instr, ValueType vt,
19541949
PatFrag ld> {
1955-
let SubtargetPredicate = HasUnrestrictedSOffset in {
1950+
let OtherPredicates = [HasUnrestrictedSOffset] in {
19561951
defm : MUBUFLoad_PatternOffset_Common<Instr, vt, ld>;
19571952
}
19581953
defm : MUBUFLoad_PatternOffset_Common<Instr # "_VBUFFER", vt, ld>;
@@ -2193,7 +2188,7 @@ multiclass MTBUF_LoadIntrinsicPat_Common<SDPatternOperator name, ValueType vt,
21932188

21942189
multiclass MTBUF_LoadIntrinsicPat<SDPatternOperator name, ValueType vt,
21952190
string opcode, ValueType memoryVt = vt> {
2196-
let SubtargetPredicate = HasUnrestrictedSOffset in {
2191+
let OtherPredicates = [HasUnrestrictedSOffset] in {
21972192
defm : MTBUF_LoadIntrinsicPat_Common<name, vt, opcode, memoryVt>;
21982193
}
21992194
defm : MTBUF_LoadIntrinsicPat_Common<name, vt, opcode # "_VBUFFER", memoryVt>;
@@ -2208,15 +2203,15 @@ defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v2f32, "TBUFFER_LOAD_FORMAT_XY">;
22082203
defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v3f32, "TBUFFER_LOAD_FORMAT_XYZ">;
22092204
defm : MTBUF_LoadIntrinsicPat<SItbuffer_load, v4f32, "TBUFFER_LOAD_FORMAT_XYZW">;
22102205

2211-
let OtherPredicates = [HasUnpackedD16VMem] in {
2206+
let SubtargetPredicate = HasUnpackedD16VMem in {
22122207
defm : MTBUF_LoadIntrinsicPat_Common<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X_gfx80">;
22132208
defm : MTBUF_LoadIntrinsicPat_Common<SItbuffer_load_d16, i32, "TBUFFER_LOAD_FORMAT_D16_X_gfx80">;
22142209
defm : MTBUF_LoadIntrinsicPat_Common<SItbuffer_load_d16, v2i32, "TBUFFER_LOAD_FORMAT_D16_XY_gfx80">;
22152210
defm : MTBUF_LoadIntrinsicPat_Common<SItbuffer_load_d16, v3i32, "TBUFFER_LOAD_FORMAT_D16_XYZ_gfx80">;
22162211
defm : MTBUF_LoadIntrinsicPat_Common<SItbuffer_load_d16, v4i32, "TBUFFER_LOAD_FORMAT_D16_XYZW_gfx80">;
22172212
} // End HasUnpackedD16VMem.
22182213

2219-
let OtherPredicates = [HasPackedD16VMem] in {
2214+
let SubtargetPredicate = HasPackedD16VMem in {
22202215
defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, f16, "TBUFFER_LOAD_FORMAT_D16_X">;
22212216
defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, i32, "TBUFFER_LOAD_FORMAT_D16_X">;
22222217
defm : MTBUF_LoadIntrinsicPat<SItbuffer_load_d16, v2f16, "TBUFFER_LOAD_FORMAT_D16_XY">;
@@ -2265,7 +2260,7 @@ multiclass MTBUF_StoreIntrinsicPat_Common<SDPatternOperator name, ValueType vt,
22652260

22662261
multiclass MTBUF_StoreIntrinsicPat<SDPatternOperator name, ValueType vt,
22672262
string opcode, ValueType memoryVt = vt> {
2268-
let SubtargetPredicate = HasUnrestrictedSOffset in {
2263+
let OtherPredicates = [HasUnrestrictedSOffset] in {
22692264
defm : MTBUF_StoreIntrinsicPat_Common<name, vt, opcode, memoryVt>;
22702265
}
22712266
defm : MTBUF_StoreIntrinsicPat_Common<name, vt, opcode # "_VBUFFER", memoryVt>;
@@ -2280,15 +2275,15 @@ defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v2f32, "TBUFFER_STORE_FORMAT_XY"
22802275
defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v3f32, "TBUFFER_STORE_FORMAT_XYZ">;
22812276
defm : MTBUF_StoreIntrinsicPat<SItbuffer_store, v4f32, "TBUFFER_STORE_FORMAT_XYZW">;
22822277

2283-
let OtherPredicates = [HasUnpackedD16VMem] in {
2278+
let SubtargetPredicate = HasUnpackedD16VMem in {
22842279
defm : MTBUF_StoreIntrinsicPat_Common<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X_gfx80">;
22852280
defm : MTBUF_StoreIntrinsicPat_Common<SItbuffer_store_d16, i32, "TBUFFER_STORE_FORMAT_D16_X_gfx80">;
22862281
defm : MTBUF_StoreIntrinsicPat_Common<SItbuffer_store_d16, v2i32, "TBUFFER_STORE_FORMAT_D16_XY_gfx80">;
22872282
defm : MTBUF_StoreIntrinsicPat_Common<SItbuffer_store_d16, v3i32, "TBUFFER_STORE_FORMAT_D16_XYZ_gfx80">;
22882283
defm : MTBUF_StoreIntrinsicPat_Common<SItbuffer_store_d16, v4i32, "TBUFFER_STORE_FORMAT_D16_XYZW_gfx80">;
22892284
} // End HasUnpackedD16VMem.
22902285

2291-
let OtherPredicates = [HasPackedD16VMem] in {
2286+
let SubtargetPredicate = HasPackedD16VMem in {
22922287
defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, f16, "TBUFFER_STORE_FORMAT_D16_X">;
22932288
defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, i32, "TBUFFER_STORE_FORMAT_D16_X">;
22942289
defm : MTBUF_StoreIntrinsicPat<SItbuffer_store_d16, v2f16, "TBUFFER_STORE_FORMAT_D16_XY">;
@@ -3267,10 +3262,7 @@ defm BUFFER_WBINVL1_VOL : MUBUF_Real_vi <0x3f>;
32673262

32683263

32693264
defm BUFFER_ATOMIC_PK_ADD_F16 : MUBUF_Real_Atomic_vi <0x4e>;
3270-
3271-
let SubtargetPredicate = HasAtomicFaddNoRtnInsts in {
32723265
defm BUFFER_ATOMIC_ADD_F32 : MUBUF_Real_Atomic_vi <0x4d>;
3273-
} // End SubtargetPredicate = HasAtomicFaddNoRtnInsts
32743266

32753267
let SubtargetPredicate = isGFX90APlus in {
32763268
defm BUFFER_ATOMIC_ADD_F64 : MUBUF_Real_Atomic_vi<0x4f>;

0 commit comments

Comments
 (0)