diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index cd704ba2df13d..516653681331e 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -1040,6 +1040,18 @@ let Extension = FuncExtOpenCLCxx in { } } +// An atomic builtin with 2 additional _explicit variants. +multiclass BuiltinAtomicExplicit Types> { + // Without explicit MemoryOrder or MemoryScope. + def : Builtin; + + // With an explicit MemoryOrder argument. + def : Builtin; + + // With explicit MemoryOrder and MemoryScope arguments. + def : Builtin; +} + // OpenCL v2.0 s6.13.11 - Atomic Functions. let MinVersion = CL20 in { def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>; @@ -1049,24 +1061,12 @@ let MinVersion = CL20 in { [AtomicFloat, Float], [AtomicDouble, Double]] in { def : Builtin<"atomic_init", [Void, PointerType, GenericAS>, TypePair[1]]>; - def : Builtin<"atomic_store", + defm : BuiltinAtomicExplicit<"atomic_store", [Void, PointerType, GenericAS>, TypePair[1]]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GenericAS>, TypePair[1], MemoryOrder]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GenericAS>, TypePair[1], MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_load", + defm : BuiltinAtomicExplicit<"atomic_load", [TypePair[1], PointerType, GenericAS>]>; - def : Builtin<"atomic_load_explicit", - [TypePair[1], PointerType, GenericAS>, MemoryOrder]>; - def : Builtin<"atomic_load_explicit", - [TypePair[1], PointerType, GenericAS>, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_exchange", + defm : BuiltinAtomicExplicit<"atomic_exchange", [TypePair[1], PointerType, GenericAS>, TypePair[1]]>; - def : Builtin<"atomic_exchange_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[1], MemoryOrder]>; - def : Builtin<"atomic_exchange_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[1], MemoryOrder, MemoryScope]>; foreach Variant = ["weak", "strong"] in { def : Builtin<"atomic_compare_exchange_" # Variant, [Bool, PointerType, GenericAS>, @@ -1084,249 +1084,125 @@ let MinVersion = CL20 in { [AtomicLong, Long, Long], [AtomicULong, ULong, ULong], [AtomicUIntPtr, UIntPtr, PtrDiff]] in { foreach ModOp = ["add", "sub"] in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [TypePair[1], PointerType, GenericAS>, TypePair[2]]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[2], MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[2], MemoryOrder, MemoryScope]>; } } foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt], [AtomicLong, Long, Long], [AtomicULong, ULong, ULong]] in { foreach ModOp = ["or", "xor", "and", "min", "max"] in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [TypePair[1], PointerType, GenericAS>, TypePair[2]]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[2], MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [TypePair[1], PointerType, GenericAS>, TypePair[2], MemoryOrder, MemoryScope]>; } } - def : Builtin<"atomic_flag_clear", + defm : BuiltinAtomicExplicit<"atomic_flag_clear", [Void, PointerType, GenericAS>]>; - def : Builtin<"atomic_flag_clear_explicit", - [Void, PointerType, GenericAS>, MemoryOrder]>; - def : Builtin<"atomic_flag_clear_explicit", - [Void, PointerType, GenericAS>, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_flag_test_and_set", + defm : BuiltinAtomicExplicit<"atomic_flag_test_and_set", [Bool, PointerType, GenericAS>]>; - def : Builtin<"atomic_flag_test_and_set_explicit", - [Bool, PointerType, GenericAS>, MemoryOrder]>; - def : Builtin<"atomic_flag_test_and_set_explicit", - [Bool, PointerType, GenericAS>, MemoryOrder, MemoryScope]>; } // The functionality added by cl_ext_float_atomics extension let MinVersion = CL20 in { let Extension = FuncExtFloatAtomicsFp16GlobalLoadStore in { - def : Builtin<"atomic_store", + defm : BuiltinAtomicExplicit<"atomic_store", [Void, PointerType, GlobalAS>, AtomicHalf]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GlobalAS>, AtomicHalf, MemoryOrder]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GlobalAS>, AtomicHalf, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_load", + defm : BuiltinAtomicExplicit<"atomic_load", [Half, PointerType, GlobalAS>]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, GlobalAS>, MemoryOrder]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, GlobalAS>, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_exchange", + defm : BuiltinAtomicExplicit<"atomic_exchange", [Half, PointerType, GlobalAS>, Half]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16LocalLoadStore in { - def : Builtin<"atomic_store", + defm : BuiltinAtomicExplicit<"atomic_store", [Void, PointerType, LocalAS>, AtomicHalf]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, LocalAS>, AtomicHalf, MemoryOrder]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, LocalAS>, AtomicHalf, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_load", + defm : BuiltinAtomicExplicit<"atomic_load", [Half, PointerType, LocalAS>]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, LocalAS>, MemoryOrder]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, LocalAS>, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_exchange", + defm : BuiltinAtomicExplicit<"atomic_exchange", [Half, PointerType, LocalAS>, Half]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16GenericLoadStore in { - def : Builtin<"atomic_store", + defm : BuiltinAtomicExplicit<"atomic_store", [Void, PointerType, GenericAS>, AtomicHalf]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GenericAS>, AtomicHalf, MemoryOrder]>; - def : Builtin<"atomic_store_explicit", - [Void, PointerType, GenericAS>, AtomicHalf, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_load", + defm : BuiltinAtomicExplicit<"atomic_load", [Half, PointerType, GenericAS>]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, GenericAS>, MemoryOrder]>; - def : Builtin<"atomic_load_explicit", - [Half, PointerType, GenericAS>, MemoryOrder, MemoryScope]>; - def : Builtin<"atomic_exchange", + defm : BuiltinAtomicExplicit<"atomic_exchange", [Half, PointerType, GenericAS>, Half]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_exchange_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; } foreach ModOp = ["add", "sub"] in { let Extension = FuncExtFloatAtomicsFp16GlobalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, GlobalAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32GlobalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, GlobalAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GlobalAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GlobalAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64GlobalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, GlobalAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GlobalAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GlobalAS>, Double, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16LocalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, LocalAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32LocalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, LocalAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, LocalAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, LocalAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64LocalAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, LocalAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, LocalAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, LocalAS>, Double, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16GenericAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, GenericAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32GenericAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, GenericAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GenericAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GenericAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64GenericAdd in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, GenericAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GenericAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GenericAS>, Double, MemoryOrder, MemoryScope]>; } } foreach ModOp = ["min", "max"] in { let Extension = FuncExtFloatAtomicsFp16GlobalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, GlobalAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32GlobalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, GlobalAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GlobalAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GlobalAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64GlobalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, GlobalAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GlobalAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GlobalAS>, Double, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16LocalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, LocalAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32LocalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, LocalAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, LocalAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, LocalAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64LocalMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, LocalAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, LocalAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, LocalAS>, Double, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp16GenericMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Half, PointerType, GenericAS>, Half]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp32GenericMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Float, PointerType, GenericAS>, Float]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GenericAS>, Float, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Float, PointerType, GenericAS>, Float, MemoryOrder, MemoryScope]>; } let Extension = FuncExtFloatAtomicsFp64GenericMinMax in { - def : Builtin<"atomic_fetch_" # ModOp, + defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp, [Double, PointerType, GenericAS>, Double]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GenericAS>, Double, MemoryOrder]>; - def : Builtin<"atomic_fetch_" # ModOp # "_explicit", - [Double, PointerType, GenericAS>, Double, MemoryOrder, MemoryScope]>; } } }