Skip to content

Commit ce5db1e

Browse files
committed
Make LLVMIsAtomicSingleThread work on non-atomic instructions.
Add LLVMIsAtomic so that users can guard uses of LLVMGetAtomicSyncScopeID.
1 parent 0028d86 commit ce5db1e

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

llvm/include/llvm-c/Core.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4630,7 +4630,13 @@ LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst);
46304630
void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool SingleThread);
46314631

46324632
/**
4633-
* Returns the synchronization scope ID of an atomic instruction
4633+
* Returns whether an instruction is an atomic instruction, e.g., atomicrmw,
4634+
* cmpxchg, fence, or loads and stores with atomic ordering.
4635+
*/
4636+
LLVMBool LLVMIsAtomic(LLVMValueRef Inst);
4637+
4638+
/**
4639+
* Returns the synchronization scope ID of an atomic instruction.
46344640
*/
46354641
unsigned LLVMGetAtomicSyncScopeID(LLVMValueRef AtomicInst);
46364642

llvm/lib/IR/Core.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4368,22 +4368,33 @@ int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) {
43684368

43694369
int LLVMGetUndefMaskElem(void) { return PoisonMaskElem; }
43704370

4371-
LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
4372-
return getAtomicSyncScopeID(unwrap<Instruction>(AtomicInst)).value() ==
4373-
SyncScope::SingleThread;
4371+
LLVMBool LLVMIsAtomic(LLVMValueRef Inst) {
4372+
return unwrap<Instruction>(Inst)->isAtomic();
43744373
}
43754374

4376-
unsigned LLVMGetAtomicSyncScopeID(LLVMValueRef AtomicInst) {
4377-
return getAtomicSyncScopeID(unwrap<Instruction>(AtomicInst)).value();
4375+
LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
4376+
// Backwards compatibility: return false for non-atomic instructions
4377+
Instruction *I = unwrap<Instruction>(AtomicInst);
4378+
if (!I->isAtomic())
4379+
return 0;
4380+
return getAtomicSyncScopeID(I).value() == SyncScope::SingleThread;
43784381
}
43794382

43804383
void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
43814384
SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
43824385
setAtomicSyncScopeID(unwrap<Instruction>(AtomicInst), SSID);
43834386
}
43844387

4388+
unsigned LLVMGetAtomicSyncScopeID(LLVMValueRef AtomicInst) {
4389+
Instruction *I = unwrap<Instruction>(AtomicInst);
4390+
assert(I->isAtomic() && "Expected an atomic instruction");
4391+
return getAtomicSyncScopeID(I).value();
4392+
}
4393+
43854394
void LLVMSetAtomicSyncScopeID(LLVMValueRef AtomicInst, unsigned SSID) {
4386-
setAtomicSyncScopeID(unwrap<Instruction>(AtomicInst), SSID);
4395+
Instruction *I = unwrap<Instruction>(AtomicInst);
4396+
assert(I->isAtomic() && "Expected an atomic instruction");
4397+
setAtomicSyncScopeID(I, SSID);
43874398
}
43884399

43894400
LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst) {

llvm/tools/llvm-c-test/echo.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -755,11 +755,13 @@ struct FunCloner {
755755
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
756756
LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
757757
LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
758-
LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread(Src);
759-
if (IsAtomicSingleThread)
760-
LLVMSetAtomicSingleThread(Dst, IsAtomicSingleThread);
761-
else
762-
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
758+
if (LLVMIsAtomic(Src)) {
759+
LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread(Src);
760+
if (IsAtomicSingleThread)
761+
LLVMSetAtomicSingleThread(Dst, IsAtomicSingleThread);
762+
else
763+
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
764+
}
763765
break;
764766
}
765767
case LLVMStore: {
@@ -769,11 +771,13 @@ struct FunCloner {
769771
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
770772
LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
771773
LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
772-
LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread(Src);
773-
if (IsAtomicSingleThread)
774-
LLVMSetAtomicSingleThread(Dst, IsAtomicSingleThread);
775-
else
776-
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
774+
if (LLVMIsAtomic(Src)) {
775+
LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread(Src);
776+
if (IsAtomicSingleThread)
777+
LLVMSetAtomicSingleThread(Dst, IsAtomicSingleThread);
778+
else
779+
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
780+
}
777781
break;
778782
}
779783
case LLVMGetElementPtr: {

0 commit comments

Comments
 (0)