@@ -11,7 +11,8 @@ let WantsRoot = true in {
1111 def GlobalOffset : ComplexPattern<iPTR, 2, "SelectGlobalOffset", [], [], -10>;
1212 def ScratchOffset : ComplexPattern<iPTR, 2, "SelectScratchOffset", [], [], -10>;
1313
14- def GlobalSAddr : ComplexPattern<iPTR, 3, "SelectGlobalSAddr", [], [], -10>;
14+ def GlobalSAddr : ComplexPattern<iPTR, 4, "SelectGlobalSAddr", [], [], -10>;
15+ def GlobalSAddrGLC : ComplexPattern<iPTR, 4, "SelectGlobalSAddrGLC", [], [], -10>;
1516 def ScratchSAddr : ComplexPattern<iPTR, 2, "SelectScratchSAddr", [], [], -10>;
1617 def ScratchSVAddr : ComplexPattern<iPTR, 3, "SelectScratchSVAddr", [], [], -10>;
1718}
@@ -1252,13 +1253,13 @@ class GlobalLoadSaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueTyp
12521253>;
12531254
12541255class FlatLoadSaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1255- (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), vt:$in)),
1256- (inst $saddr, $voffset, $offset, (i32 0) , $in)
1256+ (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol ), vt:$in)),
1257+ (inst $saddr, $voffset, $offset, $cpol , $in)
12571258>;
12581259
12591260class FlatLoadSaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1260- (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset))),
1261- (inst $saddr, $voffset, $offset, (i32 0) )
1261+ (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol ))),
1262+ (inst $saddr, $voffset, $offset, $cpol )
12621263>;
12631264
12641265class GlobalLoadSaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
@@ -1272,26 +1273,26 @@ class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt>
12721273>;
12731274
12741275class FlatLoadSaddrPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1275- (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset))),
1276- (inst $saddr, $voffset, $offset, 0 )
1276+ (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol ))),
1277+ (inst $saddr, $voffset, $offset, $cpol )
12771278>;
12781279
12791280class FlatStoreSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
12801281 ValueType vt> : GCNPat <
1281- (node vt:$data, (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset)),
1282- (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset)
1282+ (node vt:$data, (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol )),
1283+ (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset, $cpol )
12831284>;
12841285
1285- class GlobalAtomicSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1286- ValueType vt, ValueType data_vt = vt> : GCNPat <
1287- (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), data_vt:$data)),
1288- (inst $voffset, getVregSrcForVT<data_vt>.ret:$data, $saddr, $offset)
1286+ class FlatAtomicSaddrPat <FLAT_Pseudo inst, SDPatternOperator node, ComplexPattern pat ,
1287+ ValueType vt, ValueType data_vt = vt> : GCNPat <
1288+ (vt (node (pat (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol ), data_vt:$data)),
1289+ (inst $voffset, getVregSrcForVT<data_vt>.ret:$data, $saddr, $offset, $cpol )
12891290>;
12901291
12911292class GlobalAtomicNoRtnSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
12921293 ValueType vt> : GCNPat <
1293- (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), vt:$data),
1294- (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset)
1294+ (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol ), vt:$data),
1295+ (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset, $cpol )
12951296>;
12961297
12971298class FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
@@ -1320,6 +1321,12 @@ multiclass FlatAtomicNoRtnPatBase <string inst, string node, ValueType vt,
13201321 let AddedComplexity = 1 in
13211322 def : GCNPat <(vt (noRtnNode (FlatOffset i64:$vaddr, i32:$offset), data_vt:$data)),
13221323 (!cast<FLAT_Pseudo>(inst) VReg_64:$vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)>;
1324+
1325+ def : FlatAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR"), !cast<SDPatternOperator>(node),
1326+ GlobalSAddr, vt, data_vt> {
1327+ let AddedComplexity = 9;
1328+ let SubtargetPredicate = HasFlatGVSMode;
1329+ }
13231330}
13241331
13251332multiclass FlatAtomicNoRtnPatWithAddrSpace<string inst, string node, string addrSpaceSuffix,
@@ -1338,6 +1345,11 @@ multiclass FlatAtomicRtnPatBase <string inst, string node, ValueType vt,
13381345
13391346 def : GCNPat <(vt (rtnNode (FlatOffset i64:$vaddr, i32:$offset), data_vt:$data)),
13401347 (!cast<FLAT_Pseudo>(inst#"_RTN") VReg_64:$vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)>;
1348+
1349+ def : FlatAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR_RTN"), rtnNode, GlobalSAddrGLC, vt, data_vt> {
1350+ let AddedComplexity = 8;
1351+ let SubtargetPredicate = HasFlatGVSMode;
1352+ }
13411353}
13421354
13431355multiclass FlatAtomicRtnPatWithAddrSpace<string inst, string intr, string addrSpaceSuffix,
@@ -1507,7 +1519,8 @@ multiclass GlobalFLATAtomicPatsNoRtnBase<string inst, string node, ValueType vt,
15071519 def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst), !cast<SDPatternOperator>(node), vt, data_vt>;
15081520
15091521 let AddedComplexity = 13 in
1510- def : GlobalAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR"), !cast<SDPatternOperator>(node), vt, data_vt>;
1522+ def : FlatAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR"), !cast<SDPatternOperator>(node),
1523+ GlobalSAddr, vt, data_vt>;
15111524}
15121525
15131526multiclass GlobalFLATAtomicPatsRtnBase<string inst, string node, ValueType vt,
@@ -1518,7 +1531,7 @@ multiclass GlobalFLATAtomicPatsRtnBase<string inst, string node, ValueType vt,
15181531 def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst#"_RTN"), rtnNode, vt, data_vt>;
15191532
15201533 let AddedComplexity = 12 in
1521- def : GlobalAtomicSaddrPat <!cast<FLAT_Pseudo>(inst#"_SADDR_RTN"), rtnNode, vt, data_vt>;
1534+ def : FlatAtomicSaddrPat <!cast<FLAT_Pseudo>(inst#"_SADDR_RTN"), rtnNode, GlobalSAddrGLC , vt, data_vt>;
15221535}
15231536
15241537multiclass GlobalFLATAtomicPatsNoRtn<string inst, string node, ValueType vt,
@@ -1797,12 +1810,13 @@ defm : FlatAtomicPat <"FLAT_ATOMIC_MAX_F64", "atomic_load_fmax_"#as, f64>;
17971810defm : FlatStorePats <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
17981811defm : FlatStorePats <FLAT_STORE_SHORT, store_flat, i16>;
17991812
1800- let SubtargetPredicate = isGFX12Plus in {
1801- defm : FlatAtomicRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32 >;
1813+ } // End OtherPredicates = [HasFlatAddressSpace]
18021814
1803- let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
1804- defm : FlatAtomicNoRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
1805- }
1815+ let OtherPredicates = [isGFX12Plus] in
1816+ defm : FlatAtomicRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
1817+
1818+ let OtherPredicates = [isGFX12Plus, HasAtomicCSubNoRtnInsts] in
1819+ defm : FlatAtomicNoRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
18061820
18071821let OtherPredicates = [HasD16LoadStore] in {
18081822defm : FlatStorePats <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
@@ -1826,8 +1840,6 @@ defm : FlatLoadPats_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2i16>;
18261840defm : FlatLoadPats_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2f16>;
18271841}
18281842
1829- } // End OtherPredicates = [HasFlatAddressSpace]
1830-
18311843let OtherPredicates = [HasFlatGlobalInsts] in {
18321844
18331845defm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, atomic_load_aext_8_global, i32>;
0 commit comments