Skip to content

Commit b4ad3c6

Browse files
committed
Address review comments.
1 parent ce5db1e commit b4ad3c6

File tree

7 files changed

+87
-37
lines changed

7 files changed

+87
-37
lines changed

llvm/docs/ReleaseNotes.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,16 @@ Changes to the C API
165165

166166
* Support for creating instructions with custom synchronization scopes has been added:
167167

168-
* ``LLVMGetSyncScopeID`` to map a synchronization scope name to an ID
168+
* ``LLVMGetSyncScopeID`` to map a synchronization scope name to an ID.
169169
* ``LLVMBuildFenceSyncScope``, ``LLVMBuildAtomicRMWSyncScope`` and
170170
``LLVMBuildAtomicCmpXchgSyncScope`` versions of the existing builder functions
171171
with an additional synchronization scope ID parameter.
172172
* ``LLVMGetAtomicSyncScopeID`` and ``LLVMSetAtomicSyncScopeID`` to get and set the
173173
synchronization scope of any atomic instruction.
174+
* ``LLVMIsAtomic`` to check if an instruction is atomic, for use with the above functions.
175+
Because of backwards compatibility, ``LLVMIsAtomicSingleThread`` and
176+
``LLVMSetAtomicSingleThread`` continue to work with any instruction type.
177+
174178

175179
Changes to the CodeGen infrastructure
176180
-------------------------------------

llvm/lib/IR/Core.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4377,7 +4377,7 @@ LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
43774377
Instruction *I = unwrap<Instruction>(AtomicInst);
43784378
if (!I->isAtomic())
43794379
return 0;
4380-
return getAtomicSyncScopeID(I).value() == SyncScope::SingleThread;
4380+
return *getAtomicSyncScopeID(I) == SyncScope::SingleThread;
43814381
}
43824382

43834383
void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
@@ -4388,7 +4388,7 @@ void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
43884388
unsigned LLVMGetAtomicSyncScopeID(LLVMValueRef AtomicInst) {
43894389
Instruction *I = unwrap<Instruction>(AtomicInst);
43904390
assert(I->isAtomic() && "Expected an atomic instruction");
4391-
return getAtomicSyncScopeID(I).value();
4391+
return *getAtomicSyncScopeID(I);
43924392
}
43934393

43944394
void LLVMSetAtomicSyncScopeID(LLVMValueRef AtomicInst, unsigned SSID) {

llvm/tools/llvm-c-test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ endif ()
4141

4242
add_llvm_tool(llvm-c-test
4343
attributes.c
44+
atomic.c
4445
calc.c
4546
debuginfo.c
4647
diagnostic.c

llvm/tools/llvm-c-test/atomic.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*===-- atomic.c - tool for testing libLLVM and llvm-c API ----------------===*\
2+
|* *|
3+
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
4+
|* Exceptions. *|
5+
|* See https://llvm.org/LICENSE.txt for license information. *|
6+
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
7+
|* *|
8+
|*===----------------------------------------------------------------------===*|
9+
|* *|
10+
|* This file implements the --atomic-* commands in llvm-c-test. *|
11+
|* *|
12+
\*===----------------------------------------------------------------------===*/
13+
14+
#include "llvm-c-test.h"
15+
#include <assert.h>
16+
#include <stdio.h>
17+
#include <stdlib.h>
18+
#include <string.h>
19+
20+
int llvm_atomic_syncscope(void) {
21+
LLVMBuilderRef Builder = LLVMCreateBuilder();
22+
23+
LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
24+
LLVMTypeRef FT = LLVMFunctionType(LLVMVoidType(), NULL, 0, 0);
25+
LLVMValueRef F = LLVMAddFunction(M, "Fun", FT);
26+
LLVMBasicBlockRef BB = LLVMAppendBasicBlock(F, "Entry");
27+
LLVMPositionBuilderAtEnd(Builder, BB);
28+
29+
// echo.cpp already tests the new SyncScope APIs, also test the old ones here
30+
31+
// fence
32+
LLVMValueRef Fence =
33+
LLVMBuildFence(Builder, LLVMAtomicOrderingSequentiallyConsistent, 0, "");
34+
assert(!LLVMIsAtomicSingleThread(Fence));
35+
Fence =
36+
LLVMBuildFence(Builder, LLVMAtomicOrderingSequentiallyConsistent, 1, "");
37+
assert(LLVMIsAtomicSingleThread(Fence));
38+
39+
// atomicrmw
40+
LLVMValueRef Ptr = LLVMConstPointerNull(LLVMPointerType(LLVMInt32Type(), 0));
41+
LLVMValueRef Val = LLVMConstInt(LLVMInt32Type(), 0, 0);
42+
LLVMValueRef AtomicRMW =
43+
LLVMBuildAtomicRMW(Builder, LLVMAtomicRMWBinOpXchg, Ptr, Val,
44+
LLVMAtomicOrderingSequentiallyConsistent, 0);
45+
assert(!LLVMIsAtomicSingleThread(AtomicRMW));
46+
AtomicRMW = LLVMBuildAtomicRMW(Builder, LLVMAtomicRMWBinOpXchg, Ptr, Val,
47+
LLVMAtomicOrderingSequentiallyConsistent, 1);
48+
assert(LLVMIsAtomicSingleThread(AtomicRMW));
49+
50+
// cmpxchg
51+
LLVMValueRef CmpXchg = LLVMBuildAtomicCmpXchg(
52+
Builder, Ptr, Val, Val, LLVMAtomicOrderingSequentiallyConsistent,
53+
LLVMAtomicOrderingSequentiallyConsistent, 0);
54+
assert(!LLVMIsAtomicSingleThread(CmpXchg));
55+
CmpXchg = LLVMBuildAtomicCmpXchg(Builder, Ptr, Val, Val,
56+
LLVMAtomicOrderingSequentiallyConsistent,
57+
LLVMAtomicOrderingSequentiallyConsistent, 1);
58+
assert(LLVMIsAtomicSingleThread(CmpXchg));
59+
60+
LLVMDisposeBuilder(Builder);
61+
LLVMDisposeModule(M);
62+
63+
return 0;
64+
}

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

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -755,13 +755,8 @@ struct FunCloner {
755755
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
756756
LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
757757
LLVMSetVolatile(Dst, LLVMGetVolatile(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-
}
758+
if (LLVMIsAtomic(Src))
759+
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
765760
break;
766761
}
767762
case LLVMStore: {
@@ -771,13 +766,8 @@ struct FunCloner {
771766
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
772767
LLVMSetOrdering(Dst, LLVMGetOrdering(Src));
773768
LLVMSetVolatile(Dst, LLVMGetVolatile(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-
}
769+
if (LLVMIsAtomic(Src))
770+
LLVMSetAtomicSyncScopeID(Dst, LLVMGetAtomicSyncScopeID(Src));
781771
break;
782772
}
783773
case LLVMGetElementPtr: {
@@ -798,12 +788,8 @@ struct FunCloner {
798788
LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 1));
799789
LLVMAtomicRMWBinOp BinOp = LLVMGetAtomicRMWBinOp(Src);
800790
LLVMAtomicOrdering Ord = LLVMGetOrdering(Src);
801-
LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src);
802-
if (SingleThread)
803-
Dst = LLVMBuildAtomicRMW(Builder, BinOp, Ptr, Val, Ord, SingleThread);
804-
else
805-
Dst = LLVMBuildAtomicRMWSyncScope(Builder, BinOp, Ptr, Val, Ord,
806-
LLVMGetAtomicSyncScopeID(Src));
791+
Dst = LLVMBuildAtomicRMWSyncScope(Builder, BinOp, Ptr, Val, Ord,
792+
LLVMGetAtomicSyncScopeID(Src));
807793
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
808794
LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
809795
LLVMSetValueName2(Dst, Name, NameLen);
@@ -815,14 +801,8 @@ struct FunCloner {
815801
LLVMValueRef New = CloneValue(LLVMGetOperand(Src, 2));
816802
LLVMAtomicOrdering Succ = LLVMGetCmpXchgSuccessOrdering(Src);
817803
LLVMAtomicOrdering Fail = LLVMGetCmpXchgFailureOrdering(Src);
818-
LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src);
819-
if (SingleThread)
820-
Dst = LLVMBuildAtomicCmpXchg(Builder, Ptr, Cmp, New, Succ, Fail,
821-
SingleThread);
822-
else
823-
Dst = LLVMBuildAtomicCmpXchgSyncScope(Builder, Ptr, Cmp, New, Succ,
824-
Fail,
825-
LLVMGetAtomicSyncScopeID(Src));
804+
Dst = LLVMBuildAtomicCmpXchgSyncScope(
805+
Builder, Ptr, Cmp, New, Succ, Fail, LLVMGetAtomicSyncScopeID(Src));
826806
LLVMSetAlignment(Dst, LLVMGetAlignment(Src));
827807
LLVMSetVolatile(Dst, LLVMGetVolatile(Src));
828808
LLVMSetWeak(Dst, LLVMGetWeak(Src));
@@ -1013,12 +993,8 @@ struct FunCloner {
1013993
}
1014994
case LLVMFence: {
1015995
LLVMAtomicOrdering Ordering = LLVMGetOrdering(Src);
1016-
LLVMBool IsSingleThreaded = LLVMIsAtomicSingleThread(Src);
1017-
if (IsSingleThreaded)
1018-
Dst = LLVMBuildFence(Builder, Ordering, IsSingleThreaded, Name);
1019-
else
1020-
Dst = LLVMBuildFenceSyncScope(Builder, Ordering,
1021-
LLVMGetAtomicSyncScopeID(Src), Name);
996+
Dst = LLVMBuildFenceSyncScope(Builder, Ordering,
997+
LLVMGetAtomicSyncScopeID(Src), Name);
1022998
break;
1023999
}
10241000
case LLVMZExt: {

llvm/tools/llvm-c-test/llvm-c-test.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ int llvm_test_diagnostic_handler(void);
6363
int llvm_test_function_attributes(void);
6464
int llvm_test_callsite_attributes(void);
6565

66+
// atomic.c
67+
int llvm_atomic_syncscope(void);
68+
6669
#ifdef __cplusplus
6770
}
6871
#endif /* !defined(__cplusplus) */

llvm/tools/llvm-c-test/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ int main(int argc, char **argv) {
112112
} else if (argc == 2 &&
113113
!strcmp(argv[1], "--test-dibuilder-debuginfo-format")) {
114114
return llvm_test_dibuilder();
115+
} else if (argc == 2 && !strcmp(argv[1], "--atomic-syncscope")) {
116+
return llvm_atomic_syncscope();
115117
} else {
116118
print_usage();
117119
}

0 commit comments

Comments
 (0)