[llvm] [SPIRV] Lower load/store atomic to OpAtomicLoad/OpAtomicStore (PR #185696)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 23 01:28:06 PDT 2026
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?=,
Juan Manuel Martinez =?utf-8?q?Caamaño?Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/185696 at github.com>
================
@@ -2018,23 +2068,67 @@ bool SPIRVInstructionSelector::selectStore(MachineInstr &I) const {
}
}
- MachineBasicBlock &BB = *I.getParent();
- auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpStore))
- .addUse(Ptr)
- .addUse(StoreVal);
+ if (I.getNumMemOperands()) {
+ const MachineMemOperand *MemOp = *I.memoperands_begin();
+ if (MemOp->isAtomic())
+ return selectAtomicStore(I);
+ }
+
+ MachineIRBuilder MIRBuilder(I);
+ auto MIB = MIRBuilder.buildInstr(SPIRV::OpStore).addUse(Ptr).addUse(StoreVal);
if (!I.getNumMemOperands()) {
assert(I.getOpcode() == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS ||
I.getOpcode() ==
TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS);
addMemoryOperands(I.getOperand(2 + OpOffset).getImm(), MIB);
} else {
- MachineIRBuilder MIRBuilder(I);
addMemoryOperands(*I.memoperands_begin(), MIB, MIRBuilder, GR);
}
MIB.constrainAllUses(TII, TRI, RBI);
return true;
}
+bool SPIRVInstructionSelector::selectAtomicStore(MachineInstr &I) const {
+ LLVMContext &Context = I.getMF()->getFunction().getContext();
+
+ unsigned OpOffset = isa<GIntrinsic>(I) ? 1 : 0;
+ Register StoreVal = I.getOperand(0 + OpOffset).getReg();
+ Register Ptr = I.getOperand(1 + OpOffset).getReg();
+
+ SPIRVTypeInst PtrType = GR.getSPIRVTypeForVReg(Ptr);
+ SPIRVTypeInst PointeeType = GR.getPointeeType(PtrType);
+ if (!PointeeType.isTypeIntOrFloat())
+ return diagnoseUnsupported(I,
+ "Lowering to SPIR-V of atomic store is only "
+ "allowed for integer or floating point types");
+
+ const MachineMemOperand &MemOp = **I.memoperands_begin();
----------------
aobolensk wrote:
```suggestion
assert(I.getNumMemOperands());
const MachineMemOperand &MemOp = **I.memoperands_begin();
```
https://github.com/llvm/llvm-project/pull/185696
More information about the llvm-commits
mailing list