[llvm] [SandboxIR] Implement AtomicCmpXchgInst (PR #102710)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 12 13:58:10 PDT 2024
================
@@ -1303,6 +1306,104 @@ class GetElementPtrInst final
// TODO: Add missing member functions.
};
+class AtomicCmpXchgInst
+ : public SingleLLVMInstructionImpl<llvm::AtomicCmpXchgInst> {
+ AtomicCmpXchgInst(llvm::AtomicCmpXchgInst *Atomic, Context &Ctx)
+ : SingleLLVMInstructionImpl(ClassID::AtomicCmpXchg,
+ Instruction::Opcode::AtomicCmpXchg, Atomic,
+ Ctx) {}
+ friend class Context; // For constructor.
+
+public:
+ /// Return the alignment of the memory that is being allocated by the
+ /// instruction.
+ Align getAlign() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getAlign();
+ }
+
+ void setAlignment(Align Align);
+ /// Return true if this is a cmpxchg from a volatile memory
+ /// location.
+ bool isVolatile() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->isVolatile();
+ }
+ /// Specify whether this is a volatile cmpxchg.
+ void setVolatile(bool V);
+ /// Return true if this cmpxchg may spuriously fail.
+ bool isWeak() const { return cast<llvm::AtomicCmpXchgInst>(Val)->isWeak(); }
+ void setWeak(bool IsWeak);
+ static bool isValidSuccessOrdering(AtomicOrdering Ordering) {
+ return llvm::AtomicCmpXchgInst::isValidSuccessOrdering(Ordering);
+ }
+ static bool isValidFailureOrdering(AtomicOrdering Ordering) {
+ return llvm::AtomicCmpXchgInst::isValidFailureOrdering(Ordering);
+ }
+ AtomicOrdering getSuccessOrdering() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getSuccessOrdering();
+ }
+ void setSuccessOrdering(AtomicOrdering Ordering);
+
+ AtomicOrdering getFailureOrdering() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getFailureOrdering();
+ }
+ void setFailureOrdering(AtomicOrdering Ordering);
+ AtomicOrdering getMergedOrdering() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getMergedOrdering();
+ }
+ SyncScope::ID getSyncScopeID() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getSyncScopeID();
+ }
+ void setSyncScopeID(SyncScope::ID SSID);
+ Value *getPointerOperand();
+ const Value *getPointerOperand() const {
+ return const_cast<AtomicCmpXchgInst *>(this)->getPointerOperand();
+ }
+
+ Value *getCompareOperand();
+ const Value *getCompareOperand() const {
+ return const_cast<AtomicCmpXchgInst *>(this)->getCompareOperand();
+ }
+
+ Value *getNewValOperand();
+ const Value *getNewValOperand() const {
+ return const_cast<AtomicCmpXchgInst *>(this)->getNewValOperand();
+ }
+
+ /// Returns the address space of the pointer operand.
+ unsigned getPointerAddressSpace() const {
+ return cast<llvm::AtomicCmpXchgInst>(Val)->getPointerAddressSpace();
+ }
+
+ /// Returns the strongest permitted ordering on failure, given the
+ /// desired ordering on success.
+ ///
+ /// If the comparison in a cmpxchg operation fails, there is no atomic store
+ /// so release semantics cannot be provided. So this function drops explicit
+ /// Release requests from the AtomicOrdering. A SequentiallyConsistent
+ /// operation would remain SequentiallyConsistent.
+ static AtomicOrdering
----------------
vporpo wrote:
It's not strictly needed, the user could just call the LLVM version. But I feel we should be providing these functions for completeness, so that the user won't have to look for them in the LLVM IR classes.
https://github.com/llvm/llvm-project/pull/102710
More information about the llvm-commits
mailing list