[llvm] [LLVM] Add a C API for creating instructions with custom syncscopes. (PR #104775)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 20 01:17:21 PDT 2024
================
@@ -4336,34 +4368,33 @@ int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) {
int LLVMGetUndefMaskElem(void) { return PoisonMaskElem; }
-LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
- Value *P = unwrap(AtomicInst);
+LLVMBool LLVMIsAtomic(LLVMValueRef Inst) {
+ return unwrap<Instruction>(Inst)->isAtomic();
+}
- if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
- return I->getSyncScopeID() == SyncScope::SingleThread;
- else if (FenceInst *FI = dyn_cast<FenceInst>(P))
- return FI->getSyncScopeID() == SyncScope::SingleThread;
- else if (StoreInst *SI = dyn_cast<StoreInst>(P))
- return SI->getSyncScopeID() == SyncScope::SingleThread;
- else if (LoadInst *LI = dyn_cast<LoadInst>(P))
- return LI->getSyncScopeID() == SyncScope::SingleThread;
- return cast<AtomicCmpXchgInst>(P)->getSyncScopeID() ==
- SyncScope::SingleThread;
+LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
+ // Backwards compatibility: return false for non-atomic instructions
+ Instruction *I = unwrap<Instruction>(AtomicInst);
+ if (!I->isAtomic())
+ return 0;
+ return getAtomicSyncScopeID(I).value() == SyncScope::SingleThread;
}
void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
- Value *P = unwrap(AtomicInst);
SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
+ setAtomicSyncScopeID(unwrap<Instruction>(AtomicInst), SSID);
+}
- if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
- return I->setSyncScopeID(SSID);
- else if (FenceInst *FI = dyn_cast<FenceInst>(P))
- return FI->setSyncScopeID(SSID);
- else if (StoreInst *SI = dyn_cast<StoreInst>(P))
- return SI->setSyncScopeID(SSID);
- else if (LoadInst *LI = dyn_cast<LoadInst>(P))
- return LI->setSyncScopeID(SSID);
- return cast<AtomicCmpXchgInst>(P)->setSyncScopeID(SSID);
+unsigned LLVMGetAtomicSyncScopeID(LLVMValueRef AtomicInst) {
+ Instruction *I = unwrap<Instruction>(AtomicInst);
+ assert(I->isAtomic() && "Expected an atomic instruction");
+ return getAtomicSyncScopeID(I).value();
----------------
nikic wrote:
```suggestion
return *getAtomicSyncScopeID(I);
```
https://github.com/llvm/llvm-project/pull/104775
More information about the llvm-commits
mailing list