diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td b/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td @@ -546,13 +546,7 @@ // GlobalISelEmitter allows pattern matches where src and dst def count // mismatch. -multiclass ret_noret_op { - let PredicateCode = [{ return !(SDValue(N, 0).use_empty()); }], - GISelPredicateCode = [{ return true; }] in { - def "_ret" : PatFrag<(ops node:$ptr, node:$data), - (!cast(NAME) node:$ptr, node:$data)>; - } - +multiclass noret_op { let PredicateCode = [{ return (SDValue(N, 0).use_empty()); }], GISelPredicateCode = [{ return false; }] in { def "_noret" : PatFrag<(ops node:$ptr, node:$data), @@ -560,45 +554,35 @@ } } -defm int_amdgcn_flat_atomic_fadd : ret_noret_op; -defm int_amdgcn_flat_atomic_fadd_v2bf16 : ret_noret_op; -defm int_amdgcn_flat_atomic_fmin : ret_noret_op; -defm int_amdgcn_flat_atomic_fmax : ret_noret_op; -defm int_amdgcn_global_atomic_fadd : ret_noret_op; -defm int_amdgcn_global_atomic_fadd_v2bf16 : ret_noret_op; -defm int_amdgcn_global_atomic_fmin : ret_noret_op; -defm int_amdgcn_global_atomic_fmax : ret_noret_op; -defm int_amdgcn_ds_fadd_v2bf16 : ret_noret_op; +defm int_amdgcn_flat_atomic_fadd : noret_op; +defm int_amdgcn_flat_atomic_fadd_v2bf16 : noret_op; +defm int_amdgcn_flat_atomic_fmin : noret_op; +defm int_amdgcn_flat_atomic_fmax : noret_op; +defm int_amdgcn_global_atomic_fadd : noret_op; +defm int_amdgcn_global_atomic_fadd_v2bf16 : noret_op; +defm int_amdgcn_global_atomic_fmin : noret_op; +defm int_amdgcn_global_atomic_fmax : noret_op; +defm int_amdgcn_ds_fadd_v2bf16 : noret_op; -multiclass ret_noret_binary_atomic_op { +multiclass noret_binary_atomic_op { let PredicateCode = [{ return (SDValue(N, 0).use_empty()); }], GISelPredicateCode = [{ return false; }] in { defm "_noret" : binary_atomic_op; } - - let PredicateCode = [{ return !(SDValue(N, 0).use_empty()); }], - GISelPredicateCode = [{ return true; }] in { - defm "_ret" : binary_atomic_op; - } } -multiclass ret_noret_ternary_atomic_op { +multiclass noret_ternary_atomic_op { let PredicateCode = [{ return (SDValue(N, 0).use_empty()); }], GISelPredicateCode = [{ return false; }] in { defm "_noret" : ternary_atomic_op; } - - let PredicateCode = [{ return !(SDValue(N, 0).use_empty()); }], - GISelPredicateCode = [{ return true; }] in { - defm "_ret" : ternary_atomic_op; - } } multiclass binary_atomic_op_all_as { foreach as = [ "global", "flat", "constant", "local", "private", "region" ] in { let AddressSpaces = !cast("LoadAddress_"#as).AddrSpaces in { defm "_"#as : binary_atomic_op; - defm "_"#as : ret_noret_binary_atomic_op; + defm "_"#as : noret_binary_atomic_op; } } } @@ -640,13 +624,15 @@ let AddressSpaces = StoreAddress_local.AddrSpaces in { defm atomic_cmp_swap_local : ternary_atomic_op; -defm atomic_cmp_swap_local : ret_noret_ternary_atomic_op; -defm atomic_cmp_swap_local_m0 : ret_noret_ternary_atomic_op; +defm atomic_cmp_swap_local : noret_ternary_atomic_op; +defm atomic_cmp_swap_local_m0 : noret_ternary_atomic_op; +defm atomic_cmp_swap_local_m0 : ternary_atomic_op; } let AddressSpaces = StoreAddress_region.AddrSpaces in { -defm atomic_cmp_swap_region : ret_noret_ternary_atomic_op; -defm atomic_cmp_swap_region_m0 : ret_noret_ternary_atomic_op; +defm atomic_cmp_swap_region : noret_ternary_atomic_op; +defm atomic_cmp_swap_region_m0 : noret_ternary_atomic_op; +defm atomic_cmp_swap_region_m0 : ternary_atomic_op; } //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/BUFInstructions.td b/llvm/lib/Target/AMDGPU/BUFInstructions.td --- a/llvm/lib/Target/AMDGPU/BUFInstructions.td +++ b/llvm/lib/Target/AMDGPU/BUFInstructions.td @@ -1412,10 +1412,12 @@ multiclass BufferAtomicPat { foreach RtnMode = ["ret", "noret"] in { - defvar Op = !cast(OpPrefix # "_" # RtnMode + defvar Op = !cast(OpPrefix + # !if(!eq(RtnMode, "ret"), "", "_noret") # !if(isIntr, "", "_" # vt.Size)); defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", ""); + let AddedComplexity = !if(!eq(RtnMode, "ret"), 0, 1) in { def : GCNPat< (vt (Op (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset), vt:$vdata_in)), (!cast(Inst # "_OFFSET" # InstSuffix) getVregSrcForVT.ret:$vdata_in, @@ -1428,6 +1430,7 @@ (!cast(Inst # "_ADDR64" # InstSuffix) getVregSrcForVT.ret:$vdata_in, VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset) >; + } // end let AddedComplexity } // end foreach RtnMode } @@ -1439,10 +1442,12 @@ multiclass BufferAtomicCmpSwapPat { foreach RtnMode = ["ret", "noret"] in { - defvar Op = !cast("AMDGPUatomic_cmp_swap_global_" # RtnMode + defvar Op = !cast("AMDGPUatomic_cmp_swap_global" + # !if(!eq(RtnMode, "ret"), "", "_noret") # "_" # vt.Size); defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", ""); + let AddedComplexity = !if(!eq(RtnMode, "ret"), 0, 1) in { defvar OffsetResDag = (!cast(Inst # "_OFFSET" # InstSuffix) getVregSrcForVT.ret:$vdata_in, SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset); @@ -1465,6 +1470,7 @@ !if(!eq(vt, i32), sub0, sub0_sub1)), Addr64ResDag) >; + } // end let AddedComplexity } // end foreach RtnMode } @@ -1495,13 +1501,14 @@ list RtnModes = ["ret", "noret"]> { foreach RtnMode = RtnModes in { - defvar Op = !cast(!if(!eq(RtnMode, "none"), - OpPrefix, OpPrefix # "_" # RtnMode)); - defvar InstSuffix = !if(!or(!eq(RtnMode, "none"), !eq(RtnMode, "ret")), - "_RTN", ""); - defvar CachePolicy = !if(!or(!eq(RtnMode, "none"), !eq(RtnMode, "ret")), + defvar Op = !cast(OpPrefix + # !if(!eq(RtnMode, "ret"), "", "_noret")); + + defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", ""); + defvar CachePolicy = !if(!eq(RtnMode, "ret"), (set_glc $cachepolicy), (timm:$cachepolicy)); + let AddedComplexity = !if(!eq(RtnMode, "ret"), 0, 1) in { def : GCNPat< (vt (Op vt:$vdata_in, v4i32:$rsrc, 0, 0, i32:$soffset, timm:$offset, timm:$cachepolicy, 0)), @@ -1534,6 +1541,7 @@ (REG_SEQUENCE VReg_64, VGPR_32:$vindex, sub0, VGPR_32:$voffset, sub1), SReg_128:$rsrc, SCSrc_b32:$soffset, (as_i16timm $offset), CachePolicy) >; + } // end let AddedComplexity } // end foreach RtnMode } @@ -1551,7 +1559,7 @@ defm : SIBufferAtomicPat<"SIbuffer_atomic_xor", i32, "BUFFER_ATOMIC_XOR">; defm : SIBufferAtomicPat<"SIbuffer_atomic_inc", i32, "BUFFER_ATOMIC_INC">; defm : SIBufferAtomicPat<"SIbuffer_atomic_dec", i32, "BUFFER_ATOMIC_DEC">; -defm : SIBufferAtomicPat<"SIbuffer_atomic_csub", i32, "BUFFER_ATOMIC_CSUB", ["none"]>; +defm : SIBufferAtomicPat<"SIbuffer_atomic_csub", i32, "BUFFER_ATOMIC_CSUB", ["ret"]>; defm : SIBufferAtomicPat<"SIbuffer_atomic_swap", i64, "BUFFER_ATOMIC_SWAP_X2">; defm : SIBufferAtomicPat<"SIbuffer_atomic_add", i64, "BUFFER_ATOMIC_ADD_X2">; defm : SIBufferAtomicPat<"SIbuffer_atomic_sub", i64, "BUFFER_ATOMIC_SUB_X2">; @@ -1643,7 +1651,8 @@ foreach RtnMode = ["ret", "noret"] in { -defvar Op = !cast(SIbuffer_atomic_cmpswap # "_" # RtnMode); +defvar Op = !cast(SIbuffer_atomic_cmpswap + # !if(!eq(RtnMode, "ret"), "", "_noret")); defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", ""); defvar CachePolicy = !if(!eq(RtnMode, "ret"), (set_glc $cachepolicy), (timm:$cachepolicy)); diff --git a/llvm/lib/Target/AMDGPU/DSInstructions.td b/llvm/lib/Target/AMDGPU/DSInstructions.td --- a/llvm/lib/Target/AMDGPU/DSInstructions.td +++ b/llvm/lib/Target/AMDGPU/DSInstructions.td @@ -950,10 +950,11 @@ } // End AddedComplexity = 100 -class DSAtomicRetPat : GCNPat < - (frag (DS1Addr1Offset i32:$ptr, i16:$offset), vt:$value), - (inst $ptr, getVregSrcForVT.ret:$value, offset:$offset, (i1 gds)) ->; +class DSAtomicRetPat : GCNPat <(frag (DS1Addr1Offset i32:$ptr, i16:$offset), vt:$value), + (inst $ptr, getVregSrcForVT.ret:$value, offset:$offset, (i1 gds))> { + let AddedComplexity = complexity; +} multiclass DSAtomicRetPat_mc { let OtherPredicates = [LDSRequiresM0Init] in { @@ -965,75 +966,88 @@ !cast(frag#"_local_"#vt.Size)>; } - def : DSAtomicRetPat(frag#"_region_m0_"#vt.Size), 1>; + def : DSAtomicRetPat(frag#"_region_m0_"#vt.Size), + /* complexity */ 0, /* gds */ 1>; } multiclass DSAtomicRetNoRetPat_mc { let OtherPredicates = [LDSRequiresM0Init] in { def : DSAtomicRetPat(frag#"_local_m0_ret_"#vt.Size)>; + !cast(frag#"_local_m0_"#vt.Size)>; def : DSAtomicRetPat(frag#"_local_m0_noret_"#vt.Size)>; + !cast(frag#"_local_m0_noret_"#vt.Size), /* complexity */ 1>; } let OtherPredicates = [NotLDSRequiresM0Init] in { def : DSAtomicRetPat(!cast(inst)#"_gfx9"), vt, - !cast(frag#"_local_ret_"#vt.Size)>; + !cast(frag#"_local_"#vt.Size)>; def : DSAtomicRetPat(!cast(noRetInst)#"_gfx9"), vt, - !cast(frag#"_local_noret_"#vt.Size)>; + !cast(frag#"_local_noret_"#vt.Size), /* complexity */ 1>; } def : DSAtomicRetPat(frag#"_region_m0_ret_"#vt.Size), 1>; + !cast(frag#"_region_m0_"#vt.Size), + /* complexity */ 0, /* gds */ 1>; def : DSAtomicRetPat(frag#"_region_m0_noret_"#vt.Size), 1>; + !cast(frag#"_region_m0_noret_"#vt.Size), + /* complexity */ 1, /* gds */ 1>; } let SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10 in { // Caution, the order of src and cmp is the *opposite* of the BUFFER_ATOMIC_CMPSWAP opcode. -class DSAtomicCmpXChgSwapped : GCNPat < +class DSAtomicCmpXChgSwapped : GCNPat< (frag (DS1Addr1Offset i32:$ptr, i16:$offset), vt:$cmp, vt:$swap), - (inst $ptr, getVregSrcForVT.ret:$cmp, getVregSrcForVT.ret:$swap, offset:$offset, (i1 gds)) ->; + (inst $ptr, getVregSrcForVT.ret:$cmp, getVregSrcForVT.ret:$swap, offset:$offset, (i1 gds))> { + let AddedComplexity = complexity; +} multiclass DSAtomicCmpXChgSwapped_mc { let OtherPredicates = [LDSRequiresM0Init] in { - def : DSAtomicCmpXChgSwapped(frag#"_local_m0_ret_"#vt.Size)>; - def : DSAtomicCmpXChgSwapped(frag#"_local_m0_noret_"#vt.Size)>; + def : DSAtomicCmpXChgSwapped(frag#"_local_m0_"#vt.Size)>; + def : DSAtomicCmpXChgSwapped(frag#"_local_m0_noret_"#vt.Size), + /* complexity */ 1>; } let OtherPredicates = [NotLDSRequiresM0Init] in { def : DSAtomicCmpXChgSwapped(!cast(inst)#"_gfx9"), vt, - !cast(frag#"_local_ret_"#vt.Size)>; + !cast(frag#"_local_"#vt.Size)>; def : DSAtomicCmpXChgSwapped(!cast(noRetInst)#"_gfx9"), vt, - !cast(frag#"_local_noret_"#vt.Size)>; + !cast(frag#"_local_noret_"#vt.Size), + /* complexity */ 1>; } - def : DSAtomicCmpXChgSwapped(frag#"_region_m0_ret_"#vt.Size), 1>; - def : DSAtomicCmpXChgSwapped(frag#"_region_m0_noret_"#vt.Size), 1>; + def : DSAtomicCmpXChgSwapped(frag#"_region_m0_"#vt.Size), + /* complexity */ 0, /* gds */ 1>; + def : DSAtomicCmpXChgSwapped(frag#"_region_m0_noret_"#vt.Size), + /* complexity */ 1, /* gds */ 1>; } } // End SubtargetPredicate = isGFX6GFX7GFX8GFX9GFX10 let SubtargetPredicate = isGFX11Plus in { // The order of src and cmp agrees with the BUFFER_ATOMIC_CMPSWAP opcode. -class DSAtomicCmpXChg : GCNPat < +class DSAtomicCmpXChg : GCNPat< (frag (DS1Addr1Offset i32:$ptr, i16:$offset), vt:$cmp, vt:$swap), - (inst $ptr, getVregSrcForVT.ret:$swap, getVregSrcForVT.ret:$cmp, offset:$offset, (i1 gds)) ->; + (inst $ptr, getVregSrcForVT.ret:$swap, getVregSrcForVT.ret:$cmp, offset:$offset, (i1 gds))> { + let AddedComplexity = complexity; +} multiclass DSAtomicCmpXChg_mc { def : DSAtomicCmpXChg(!cast(inst)#"_gfx9"), vt, - !cast(frag#"_local_ret_"#vt.Size)>; + !cast(frag#"_local_"#vt.Size)>; def : DSAtomicCmpXChg(!cast(noRetInst)#"_gfx9"), vt, - !cast(frag#"_local_noret_"#vt.Size)>; + !cast(frag#"_local_noret_"#vt.Size), /* complexity */ 1>; - def : DSAtomicCmpXChg(frag#"_region_m0_ret_"#vt.Size), 1>; - def : DSAtomicCmpXChg(frag#"_region_m0_noret_"#vt.Size), 1>; + def : DSAtomicCmpXChg(frag#"_region_m0_"#vt.Size), + /* complexity */ 0, /* gds */ 1>; + def : DSAtomicCmpXChg(frag#"_region_m0_noret_"#vt.Size), + /* complexity */ 1, /* gds */ 1>; } } // End SubtargetPredicate = isGFX11Plus @@ -1090,17 +1104,20 @@ } // End SubtargetPredicate = isGFX11Plus let SubtargetPredicate = isGFX90APlus in { -def : DSAtomicRetPat; +def : DSAtomicRetPat; +let AddedComplexity = 1 in def : DSAtomicRetPat; } let SubtargetPredicate = isGFX940Plus in { -def : DSAtomicRetPat; +def : DSAtomicRetPat; +let AddedComplexity = 1 in def : DSAtomicRetPat; def : GCNPat < - (v2i16 (int_amdgcn_ds_fadd_v2bf16_ret i32:$ptr, v2i16:$src)), + (v2i16 (int_amdgcn_ds_fadd_v2bf16 i32:$ptr, v2i16:$src)), (DS_PK_ADD_RTN_BF16 VGPR_32:$ptr, VGPR_32:$src, 0, 0) >; +let AddedComplexity = 1 in def : GCNPat < (v2i16 (int_amdgcn_ds_fadd_v2bf16_noret i32:$ptr, v2i16:$src)), (DS_PK_ADD_BF16 VGPR_32:$ptr, VGPR_32:$src, 0, 0) diff --git a/llvm/lib/Target/AMDGPU/FLATInstructions.td b/llvm/lib/Target/AMDGPU/FLATInstructions.td --- a/llvm/lib/Target/AMDGPU/FLATInstructions.td +++ b/llvm/lib/Target/AMDGPU/FLATInstructions.td @@ -1015,31 +1015,35 @@ multiclass FlatAtomicPat { - defvar rtnNode = !cast(node#"_ret_"#vt.Size); + defvar rtnNode = !cast(node#"_"#vt.Size); defvar noRtnNode = !cast(node#"_noret_"#vt.Size); def : GCNPat <(vt (rtnNode (FlatOffset i64:$vaddr, i16:$offset), data_vt:$data)), (!cast(inst#"_RTN") VReg_64:$vaddr, getVregSrcForVT.ret:$data, $offset)>; + let AddedComplexity = 1 in def : GCNPat <(vt (noRtnNode (FlatOffset i64:$vaddr, i16:$offset), data_vt:$data)), (!cast(inst) VReg_64:$vaddr, getVregSrcForVT.ret:$data, $offset)>; } multiclass FlatSignedAtomicPat { - defvar rtnNode = !cast(node # "_ret" # !if(isIntr, "", "_" # vt.Size)); + ValueType data_vt = vt, int complexity = 0, + bit isIntr = 0> { + defvar rtnNode = !cast(node # !if(isIntr, "", "_" # vt.Size)); defvar noRtnNode = !cast(node # "_noret" # !if(isIntr, "", "_" # vt.Size)); + let AddedComplexity = complexity in def : GCNPat <(vt (rtnNode (GlobalOffset i64:$vaddr, i16:$offset), data_vt:$data)), (!cast(inst#"_RTN") VReg_64:$vaddr, getVregSrcForVT.ret:$data, $offset)>; + let AddedComplexity = !add(complexity, 1) in def : GCNPat <(vt (noRtnNode (GlobalOffset i64:$vaddr, i16:$offset), data_vt:$data)), (!cast(inst) VReg_64:$vaddr, getVregSrcForVT.ret:$data, $offset)>; } multiclass FlatSignedAtomicIntrPat { - defm : FlatSignedAtomicPat; + defm : FlatSignedAtomicPat; } class FlatSignedAtomicPatNoRtn : GCNPat < @@ -1260,17 +1264,16 @@ multiclass GlobalFLATAtomicPats { - defvar rtnNode = !cast(node # "_ret" # !if(isIntr, "", "_" # vt.Size)); + defvar rtnNode = !cast(node # !if(isIntr, "", "_" # vt.Size)); defvar noRtnNode = !cast(node # "_noret" # !if(isIntr, "", "_" # vt.Size)); - let AddedComplexity = 10 in { - defm : FlatSignedAtomicPat ; - } + defm : FlatSignedAtomicPat ; - let AddedComplexity = 11 in { - def : GlobalAtomicSaddrPat(inst#"_SADDR"), noRtnNode, vt, data_vt>; - def : GlobalAtomicSaddrPat(inst#"_SADDR_RTN"), rtnNode, vt, data_vt>; - } + let AddedComplexity = 13 in + def : GlobalAtomicSaddrPat(inst#"_SADDR"), noRtnNode, vt, data_vt>; + + let AddedComplexity = 12 in + def : GlobalAtomicSaddrPat(inst#"_SADDR_RTN"), rtnNode, vt, data_vt>; } multiclass GlobalFLATAtomicIntrPats; def SIbuffer_atomic_fmax : SDBufferAtomic <"AMDGPUISD::BUFFER_ATOMIC_FMAX">; -multiclass SDBufferAtomicRetNoRet { - def "_ret" : PatFrag< - (ops node:$vdata_in, node:$rsrc, node:$vindex, node:$voffset, node:$soffset, - node:$offset, node:$cachepolicy, node:$idxen), - (!cast(NAME) node:$vdata_in, node:$rsrc, node:$vindex, - node:$voffset, node:$soffset, node:$offset, node:$cachepolicy, - node:$idxen)> { - let PredicateCode = [{ return !(SDValue(N, 0).use_empty()); }]; - let GISelPredicateCode = [{ return true; }]; - } - +multiclass SDBufferAtomicNoRet { def "_noret" : PatFrag< (ops node:$vdata_in, node:$rsrc, node:$vindex, node:$voffset, node:$soffset, node:$offset, node:$cachepolicy, node:$idxen), @@ -215,21 +205,21 @@ } } -defm SIbuffer_atomic_swap : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_add : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_sub : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_smin : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_umin : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_smax : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_umax : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_and : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_or : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_xor : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_inc : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_dec : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_fadd : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_fmin : SDBufferAtomicRetNoRet; -defm SIbuffer_atomic_fmax : SDBufferAtomicRetNoRet; +defm SIbuffer_atomic_swap : SDBufferAtomicNoRet; +defm SIbuffer_atomic_add : SDBufferAtomicNoRet; +defm SIbuffer_atomic_sub : SDBufferAtomicNoRet; +defm SIbuffer_atomic_smin : SDBufferAtomicNoRet; +defm SIbuffer_atomic_umin : SDBufferAtomicNoRet; +defm SIbuffer_atomic_smax : SDBufferAtomicNoRet; +defm SIbuffer_atomic_umax : SDBufferAtomicNoRet; +defm SIbuffer_atomic_and : SDBufferAtomicNoRet; +defm SIbuffer_atomic_or : SDBufferAtomicNoRet; +defm SIbuffer_atomic_xor : SDBufferAtomicNoRet; +defm SIbuffer_atomic_inc : SDBufferAtomicNoRet; +defm SIbuffer_atomic_dec : SDBufferAtomicNoRet; +defm SIbuffer_atomic_fadd : SDBufferAtomicNoRet; +defm SIbuffer_atomic_fmin : SDBufferAtomicNoRet; +defm SIbuffer_atomic_fmax : SDBufferAtomicNoRet; def SIbuffer_atomic_cmpswap : SDNode <"AMDGPUISD::BUFFER_ATOMIC_CMPSWAP", SDTypeProfile<1, 9, @@ -246,16 +236,6 @@ [SDNPMemOperand, SDNPHasChain, SDNPMayLoad, SDNPMayStore] >; -def SIbuffer_atomic_cmpswap_ret : PatFrag< - (ops node:$src, node:$cmp, node:$rsrc, node:$vindex, node:$voffset, - node:$soffset, node:$offset, node:$cachepolicy, node:$idxen), - (SIbuffer_atomic_cmpswap node:$src, node:$cmp, node:$rsrc, node:$vindex, - node:$voffset, node:$soffset, node:$offset, node:$cachepolicy, - node:$idxen)> { - let PredicateCode = [{ return !(SDValue(N, 0).use_empty()); }]; - let GISelPredicateCode = [{ return true; }]; -} - def SIbuffer_atomic_cmpswap_noret : PatFrag< (ops node:$src, node:$cmp, node:$rsrc, node:$vindex, node:$voffset, node:$soffset, node:$offset, node:$cachepolicy, node:$idxen), @@ -774,13 +754,13 @@ let AddressSpaces = StoreAddress_local.AddrSpaces in { defm _local_m0 : binary_atomic_op (NAME#"_glue"), IsInt>; - defm _local_m0 : ret_noret_binary_atomic_op (NAME#"_glue"), + defm _local_m0 : noret_binary_atomic_op (NAME#"_glue"), IsInt>; } let AddressSpaces = StoreAddress_region.AddrSpaces in { defm _region_m0 : binary_atomic_op (NAME#"_glue"), IsInt>; - defm _region_m0 : ret_noret_binary_atomic_op (NAME#"_glue"), + defm _region_m0 : noret_binary_atomic_op (NAME#"_glue"), IsInt>; } }