[clang] 319ea2d - [OpenCL] Add atomic type builtins

Sven van Haastregt via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 26 06:08:52 PST 2020


Author: Sven van Haastregt
Date: 2020-02-26T14:08:23Z
New Revision: 319ea2dd9e32cd10415e1f5060e84febf7c606c6

URL: https://github.com/llvm/llvm-project/commit/319ea2dd9e32cd10415e1f5060e84febf7c606c6
DIFF: https://github.com/llvm/llvm-project/commit/319ea2dd9e32cd10415e1f5060e84febf7c606c6.diff

LOG: [OpenCL] Add atomic type builtins

Add atomic types and builtins operating on those atomic types to
`-fdeclare-opencl-builtins`.  The _explicit variants are left out of
this commit, as these take enum arguments that are not yet supported
by the `-fdeclare-opencl-builtins` machinery.

Added: 
    

Modified: 
    clang/lib/Sema/OpenCLBuiltins.td

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td
index f79bb54a8143..4ccb6b5fd49d 100644
--- a/clang/lib/Sema/OpenCLBuiltins.td
+++ b/clang/lib/Sema/OpenCLBuiltins.td
@@ -265,7 +265,7 @@ def Half      : Type<"half",      QualType<"HalfTy">>;
 def Size      : Type<"size_t",    QualType<"getSizeType()">>;
 def PtrDiff   : Type<"ptr
diff _t", QualType<"getPointerDiffType()">>;
 def IntPtr    : Type<"intptr_t",  QualType<"getIntPtrType()">>;
-def UIntPtr   : Type<"uintPtr_t", QualType<"getUIntPtrType()">>;
+def UIntPtr   : Type<"uintptr_t", QualType<"getUIntPtrType()">>;
 def Void      : Type<"void",      QualType<"VoidTy">>;
 
 // OpenCL v1.0/1.2/2.0 s6.1.2: Built-in Vector Data Types.
@@ -290,6 +290,18 @@ def Image2dArrayMsaaDepth : Type<"image2d_array_msaa_depth_t", QualType<"OCLImag
 def Sampler               : Type<"sampler_t", QualType<"OCLSamplerTy">>;
 def Event                 : Type<"event_t", QualType<"OCLEventTy">>;
 
+// OpenCL v2.0 s6.13.11: Atomic integer and floating-point types.
+def AtomicInt             : Type<"atomic_int", QualType<"getAtomicType(Context.IntTy)">>;
+def AtomicUInt            : Type<"atomic_uint", QualType<"getAtomicType(Context.UnsignedIntTy)">>;
+def AtomicLong            : Type<"atomic_long", QualType<"getAtomicType(Context.LongTy)">>;
+def AtomicULong           : Type<"atomic_ulong", QualType<"getAtomicType(Context.UnsignedLongTy)">>;
+def AtomicFloat           : Type<"atomic_float", QualType<"getAtomicType(Context.FloatTy)">>;
+def AtomicDouble          : Type<"atomic_double", QualType<"getAtomicType(Context.DoubleTy)">>;
+def AtomicIntPtr          : Type<"atomic_intptr_t", QualType<"getAtomicType(Context.getIntPtrType())">>;
+def AtomicUIntPtr         : Type<"atomic_uintptr_t", QualType<"getAtomicType(Context.getUIntPtrType())">>;
+def AtomicSize            : Type<"atomic_size_t", QualType<"getAtomicType(Context.getSizeType())">>;
+def AtomicPtrDiff         : Type<"atomic_ptr
diff _t", QualType<"getAtomicType(Context.getPointerDiffType())">>;
+
 //===----------------------------------------------------------------------===//
 //                 Definitions of OpenCL gentype variants
 //===----------------------------------------------------------------------===//
@@ -984,6 +996,45 @@ foreach AS = [GlobalAS, LocalAS] in {
     }
   }
 }
+// OpenCL v2.0 s6.13.11 - Atomic Functions.
+let MinVersion = CL20 in {
+  foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
+                      [AtomicLong, Long], [AtomicULong, ULong],
+                      [AtomicFloat, Float], [AtomicDouble, Double]] in {
+    def : Builtin<"atomic_init",
+        [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
+    def : Builtin<"atomic_store",
+        [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
+    def : Builtin<"atomic_load",
+        [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>]>;
+    def : Builtin<"atomic_exchange",
+        [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
+    foreach Variant = ["weak", "strong"] in {
+      def : Builtin<"atomic_compare_exchange_" # Variant,
+          [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
+           PointerType<TypePair[1], GenericAS>, TypePair[1]]>;
+    }
+  }
+
+  foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
+                      [AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
+                      [AtomicIntPtr, IntPtr, PtrDiff],
+                      [AtomicUIntPtr, UIntPtr, PtrDiff]] in {
+    foreach ModOp = ["add", "sub"] in {
+      def : Builtin<"atomic_fetch_" # ModOp,
+          [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
+    }
+  }
+  foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
+                      [AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
+                      [AtomicIntPtr, IntPtr, IntPtr],
+                      [AtomicUIntPtr, UIntPtr, UIntPtr]] in {
+    foreach ModOp = ["or", "xor", "and", "min", "max"] in {
+      def : Builtin<"atomic_fetch_" # ModOp,
+          [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
+    }
+  }
+}
 
 //--------------------------------------------------------------------
 // OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions


        


More information about the cfe-commits mailing list