[llvm] [NFC][SPIR-V] Remove dead non-intrinsic path in selectAtomicCmpXchg (PR #193692)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 23 01:51:59 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
SPIRVEmitIntrinsics unconditionally rewrites every cmpxchg into the @<!-- -->llvm.spv.cmpxchg intrinsic before instruction selection, so G_ATOMIC_CMPXCHG branch of selectAtomicCmpXchg was never reached
---
Full diff: https://github.com/llvm/llvm-project/pull/193692.diff
1 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+5-30)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index 56aacaf63928c..c6deffde24af8 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -1344,8 +1344,6 @@ bool SPIRVInstructionSelector::spvSelect(Register ResVReg,
return selectAtomicRMW(ResVReg, ResType, I, SPIRV::OpAtomicUMin);
case TargetOpcode::G_ATOMICRMW_XCHG:
return selectAtomicRMW(ResVReg, ResType, I, SPIRV::OpAtomicExchange);
- case TargetOpcode::G_ATOMIC_CMPXCHG:
- return selectAtomicCmpXchg(ResVReg, ResType, I);
case TargetOpcode::G_ATOMICRMW_FADD:
return selectAtomicRMW(ResVReg, ResType, I, SPIRV::OpAtomicFAddEXT);
@@ -2355,35 +2353,12 @@ bool SPIRVInstructionSelector::selectOverflowArith(Register ResVReg,
bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
SPIRVTypeInst ResType,
MachineInstr &I) const {
- Register ScopeReg;
- Register MemSemEqReg;
- Register MemSemNeqReg;
+ assert(isa<GIntrinsic>(I) &&
+ "selectAtomicCmpXchg only handles the spv_cmpxchg intrinsic");
Register Ptr = I.getOperand(2).getReg();
- if (!isa<GIntrinsic>(I)) {
- assert(I.hasOneMemOperand());
- const MachineMemOperand *MemOp = *I.memoperands_begin();
- unsigned Scope = static_cast<uint32_t>(getMemScope(
- GR.CurMF->getFunction().getContext(), MemOp->getSyncScopeID()));
- ScopeReg = buildI32Constant(Scope, I);
-
- unsigned ScSem = static_cast<uint32_t>(
- getMemSemanticsForStorageClass(GR.getPointerStorageClass(Ptr)));
- AtomicOrdering AO = MemOp->getSuccessOrdering();
- unsigned MemSemEq = static_cast<uint32_t>(getMemSemantics(AO)) | ScSem;
- Register MemSemEqReg = buildI32Constant(MemSemEq, I);
- AtomicOrdering FO = MemOp->getFailureOrdering();
- unsigned MemSemNeq = static_cast<uint32_t>(getMemSemantics(FO)) | ScSem;
- if (MemSemEq == MemSemNeq)
- MemSemNeqReg = MemSemEqReg;
- else {
- MemSemNeqReg = buildI32Constant(MemSemEq, I);
- }
- } else {
- ScopeReg = I.getOperand(5).getReg();
- MemSemEqReg = I.getOperand(6).getReg();
- MemSemNeqReg = I.getOperand(7).getReg();
- }
-
+ Register ScopeReg = I.getOperand(5).getReg();
+ Register MemSemEqReg = I.getOperand(6).getReg();
+ Register MemSemNeqReg = I.getOperand(7).getReg();
Register Cmp = I.getOperand(3).getReg();
Register Val = I.getOperand(4).getReg();
SPIRVTypeInst SpvValTy = GR.getSPIRVTypeForVReg(Val);
``````````
</details>
https://github.com/llvm/llvm-project/pull/193692
More information about the llvm-commits
mailing list