Skip to content

Commit 865a18c

Browse files
svenvhtstellar
authored andcommitted
[OpenCL] Move OpenCL 2.0 atomics into multiclass; NFC
This is in preparation for adding the OpenCL 3.0 builtins with named address space arguments. (cherry picked from commit 31fa3a4)
1 parent 174dffb commit 865a18c

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

clang/lib/Sema/OpenCLBuiltins.td

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,8 @@ let Extension = FuncExtOpenCLCxx in {
10401040
}
10411041
}
10421042

1043+
// OpenCL v2.0 s6.13.11 - Atomic Functions.
1044+
10431045
// An atomic builtin with 2 additional _explicit variants.
10441046
multiclass BuiltinAtomicExplicit<string Name, list<Type> Types> {
10451047
// Without explicit MemoryOrder or MemoryScope.
@@ -1052,31 +1054,29 @@ multiclass BuiltinAtomicExplicit<string Name, list<Type> Types> {
10521054
def : Builtin<Name # "_explicit", !listconcat(Types, [MemoryOrder, MemoryScope])>;
10531055
}
10541056

1055-
// OpenCL v2.0 s6.13.11 - Atomic Functions.
1056-
let MinVersion = CL20 in {
1057-
def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
1058-
1057+
// OpenCL 2.0 atomic functions that have a pointer argument in a given address space.
1058+
multiclass OpenCL2Atomics<AddressSpace addrspace> {
10591059
foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
10601060
[AtomicLong, Long], [AtomicULong, ULong],
10611061
[AtomicFloat, Float], [AtomicDouble, Double]] in {
10621062
def : Builtin<"atomic_init",
1063-
[Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1063+
[Void, PointerType<VolatileType<TypePair[0]>, addrspace>, TypePair[1]]>;
10641064
defm : BuiltinAtomicExplicit<"atomic_store",
1065-
[Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1065+
[Void, PointerType<VolatileType<TypePair[0]>, addrspace>, TypePair[1]]>;
10661066
defm : BuiltinAtomicExplicit<"atomic_load",
1067-
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>]>;
1067+
[TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace>]>;
10681068
defm : BuiltinAtomicExplicit<"atomic_exchange",
1069-
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1069+
[TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace>, TypePair[1]]>;
10701070
foreach Variant = ["weak", "strong"] in {
10711071
def : Builtin<"atomic_compare_exchange_" # Variant,
1072-
[Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
1073-
PointerType<TypePair[1], GenericAS>, TypePair[1]]>;
1072+
[Bool, PointerType<VolatileType<TypePair[0]>, addrspace>,
1073+
PointerType<TypePair[1], addrspace>, TypePair[1]]>;
10741074
def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
1075-
[Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
1076-
PointerType<TypePair[1], GenericAS>, TypePair[1], MemoryOrder, MemoryOrder]>;
1075+
[Bool, PointerType<VolatileType<TypePair[0]>, addrspace>,
1076+
PointerType<TypePair[1], addrspace>, TypePair[1], MemoryOrder, MemoryOrder]>;
10771077
def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
1078-
[Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
1079-
PointerType<TypePair[1], GenericAS>, TypePair[1], MemoryOrder, MemoryOrder, MemoryScope]>;
1078+
[Bool, PointerType<VolatileType<TypePair[0]>, addrspace>,
1079+
PointerType<TypePair[1], addrspace>, TypePair[1], MemoryOrder, MemoryOrder, MemoryScope]>;
10801080
}
10811081
}
10821082

@@ -1085,22 +1085,28 @@ let MinVersion = CL20 in {
10851085
[AtomicUIntPtr, UIntPtr, PtrDiff]] in {
10861086
foreach ModOp = ["add", "sub"] in {
10871087
defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp,
1088-
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
1088+
[TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace>, TypePair[2]]>;
10891089
}
10901090
}
10911091
foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
10921092
[AtomicLong, Long, Long], [AtomicULong, ULong, ULong]] in {
10931093
foreach ModOp = ["or", "xor", "and", "min", "max"] in {
10941094
defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp,
1095-
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
1095+
[TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace>, TypePair[2]]>;
10961096
}
10971097
}
10981098

10991099
defm : BuiltinAtomicExplicit<"atomic_flag_clear",
1100-
[Void, PointerType<VolatileType<AtomicFlag>, GenericAS>]>;
1100+
[Void, PointerType<VolatileType<AtomicFlag>, addrspace>]>;
11011101

11021102
defm : BuiltinAtomicExplicit<"atomic_flag_test_and_set",
1103-
[Bool, PointerType<VolatileType<AtomicFlag>, GenericAS>]>;
1103+
[Bool, PointerType<VolatileType<AtomicFlag>, addrspace>]>;
1104+
}
1105+
1106+
let MinVersion = CL20 in {
1107+
def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
1108+
1109+
defm : OpenCL2Atomics<GenericAS>;
11041110
}
11051111

11061112
// The functionality added by cl_ext_float_atomics extension

0 commit comments

Comments
 (0)