diff --git a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td index 0df66e1ffc519..5f1d1d932f74c 100644 --- a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td +++ b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td @@ -1174,9 +1174,9 @@ class AMDGPUStructPtrBufferStore : DefaultAttrsI def int_amdgcn_struct_ptr_buffer_store_format : AMDGPUStructPtrBufferStore; def int_amdgcn_struct_ptr_buffer_store : AMDGPUStructPtrBufferStore; -class AMDGPURawBufferAtomic : Intrinsic < - !if(NoRtn, [], [data_ty]), - [!if(NoRtn, data_ty, LLVMMatchType<0>), // vdata(VGPR) +class AMDGPURawBufferAtomic : Intrinsic < + [data_ty], + [LLVMMatchType<0>, // vdata(VGPR) llvm_v4i32_ty, // rsrc(SGPR) llvm_i32_ty, // offset(VGPR/imm, included in bounds checking and swizzling) llvm_i32_ty, // soffset(SGPR/imm, excluded from bounds checking and swizzling) @@ -1208,9 +1208,9 @@ def int_amdgcn_raw_buffer_atomic_cmpswap : Intrinsic< [ImmArg>, IntrWillReturn, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<2, 0>; -class AMDGPURawPtrBufferAtomic : Intrinsic < - !if(NoRtn, [], [data_ty]), - [!if(NoRtn, data_ty, LLVMMatchType<0>), // vdata(VGPR) +class AMDGPURawPtrBufferAtomic : Intrinsic < + [data_ty], + [LLVMMatchType<0>, // vdata(VGPR) AMDGPUBufferRsrcTy, // rsrc(SGPR) llvm_i32_ty, // offset(VGPR/imm, included in bounds checking and swizzling) llvm_i32_ty, // soffset(SGPR/imm, excluded from bounds checking and swizzling) @@ -1249,9 +1249,9 @@ def int_amdgcn_raw_ptr_buffer_atomic_cmpswap : Intrinsic< def int_amdgcn_raw_buffer_atomic_fadd : AMDGPURawBufferAtomic; def int_amdgcn_raw_ptr_buffer_atomic_fadd : AMDGPURawPtrBufferAtomic; -class AMDGPUStructBufferAtomic : Intrinsic < - !if(NoRtn, [], [data_ty]), - [!if(NoRtn, data_ty, LLVMMatchType<0>), // vdata(VGPR) +class AMDGPUStructBufferAtomic : Intrinsic < + [data_ty], + [LLVMMatchType<0>, // vdata(VGPR) llvm_v4i32_ty, // rsrc(SGPR) llvm_i32_ty, // vindex(VGPR) llvm_i32_ty, // offset(VGPR/imm, included in bounds checking and swizzling) @@ -1283,9 +1283,9 @@ def int_amdgcn_struct_buffer_atomic_cmpswap : Intrinsic< [ImmArg>, IntrWillReturn, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<2, 0>; -class AMDGPUStructPtrBufferAtomic : Intrinsic < - !if(NoRtn, [], [data_ty]), - [!if(NoRtn, data_ty, LLVMMatchType<0>), // vdata(VGPR) +class AMDGPUStructPtrBufferAtomic : Intrinsic < + [data_ty], + [LLVMMatchType<0>, // vdata(VGPR) AMDGPUBufferRsrcTy, // rsrc(SGPR) llvm_i32_ty, // vindex(VGPR) llvm_i32_ty, // offset(VGPR/imm, included in bounds checking and swizzling) diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index d6717c998bec8..21abfb42d11ba 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -5879,31 +5879,23 @@ bool AMDGPULegalizerInfo::legalizeBufferAtomic(MachineInstr &MI, IID == Intrinsic::amdgcn_struct_buffer_atomic_cmpswap || IID == Intrinsic::amdgcn_raw_ptr_buffer_atomic_cmpswap || IID == Intrinsic::amdgcn_struct_ptr_buffer_atomic_cmpswap; - const bool HasReturn = MI.getNumExplicitDefs() != 0; - - Register Dst; - - int OpOffset = 0; - if (HasReturn) { - // A few FP atomics do not support return values. - Dst = MI.getOperand(0).getReg(); - } else { - OpOffset = -1; - } + Register Dst = MI.getOperand(0).getReg(); // Since we don't have 128-bit atomics, we don't need to handle the case of // p8 argmunents to the atomic itself - Register VData = MI.getOperand(2 + OpOffset).getReg(); + Register VData = MI.getOperand(2).getReg(); + Register CmpVal; + int OpOffset = 0; if (IsCmpSwap) { - CmpVal = MI.getOperand(3 + OpOffset).getReg(); + CmpVal = MI.getOperand(3).getReg(); ++OpOffset; } castBufferRsrcArgToV4I32(MI, B, 3 + OpOffset); Register RSrc = MI.getOperand(3 + OpOffset).getReg(); - const unsigned NumVIndexOps = (IsCmpSwap ? 8 : 7) + HasReturn; + const unsigned NumVIndexOps = IsCmpSwap ? 9 : 8; // The struct intrinsic variants add one additional operand over raw. const bool HasVIndex = MI.getNumOperands() == NumVIndexOps; @@ -5924,12 +5916,9 @@ bool AMDGPULegalizerInfo::legalizeBufferAtomic(MachineInstr &MI, unsigned ImmOffset; std::tie(VOffset, ImmOffset) = splitBufferOffsets(B, VOffset); - auto MIB = B.buildInstr(getBufferAtomicPseudo(IID)); - - if (HasReturn) - MIB.addDef(Dst); - - MIB.addUse(VData); // vdata + auto MIB = B.buildInstr(getBufferAtomicPseudo(IID)) + .addDef(Dst) + .addUse(VData); // vdata if (IsCmpSwap) MIB.addReg(CmpVal); diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 2e4708205523b..9fdd6f04d2a0f 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -3572,8 +3572,8 @@ def G_AMDGPU_ATOMIC_FMIN : G_ATOMICRMW_OP; def G_AMDGPU_ATOMIC_FMAX : G_ATOMICRMW_OP; } -class BufferAtomicGenericInstruction : AMDGPUGenericInstruction { - let OutOperandList = !if(NoRtn, (outs), (outs type0:$dst)); +class BufferAtomicGenericInstruction : AMDGPUGenericInstruction { + let OutOperandList = (outs type0:$dst); let InOperandList = (ins type0:$vdata, type1:$rsrc, type2:$vindex, type2:$voffset, type2:$soffset, untyped_imm_0:$offset, untyped_imm_0:$cachepolicy, untyped_imm_0:$idxen);