This revision was automatically updated to reflect the committed changes. Closed by commit rG92b00ffe0fb3: [OpenCL] Reduce duplicate defs by using multiclasses; NFC (authored by svenvh).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D107151/new/ https://reviews.llvm.org/D107151 Files: clang/lib/Sema/OpenCLBuiltins.td
Index: clang/lib/Sema/OpenCLBuiltins.td =================================================================== --- clang/lib/Sema/OpenCLBuiltins.td +++ clang/lib/Sema/OpenCLBuiltins.td @@ -543,9 +543,10 @@ def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; } -// --- Version dependent --- -let MaxVersion = CL20 in { - foreach AS = [GlobalAS, LocalAS, PrivateAS] in { +// The following math builtins take pointer arguments. Which overloads are +// available depends on whether the generic address space feature is enabled. +multiclass MathWithPointer<list<AddressSpace> addrspaces> { + foreach AS = addrspaces in { foreach name = ["fract", "modf", "sincos"] in { def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, AS>]>; } @@ -561,19 +562,12 @@ } } } + +let MaxVersion = CL20 in { + defm : MathWithPointer<[GlobalAS, LocalAS, PrivateAS]>; +} let MinVersion = CL20 in { - foreach name = ["fract", "modf", "sincos"] in { - def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, GenericAS>]>; - } - foreach name = ["frexp", "lgamma_r"] in { - foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { - def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>; - } } - foreach name = ["remquo"] in { - foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { - def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>; - } - } + defm : MathWithPointer<[GenericAS]>; } // --- Table 9 --- @@ -783,10 +777,8 @@ // OpenCL v1.1 s6.11.7, v1.2 s6.12.7, v2.0 s6.13.7 - Vector Data Load and Store Functions // OpenCL Extension v1.1 s9.3.6 and s9.6.6, v1.2 s9.5.6, v2.0 s5.1.6 and s6.1.6 - Vector Data Load and Store Functions // --- Table 15 --- -// Variants for OpenCL versions below 2.0, using pointers to the global, local -// and private address spaces. -let MaxVersion = CL20 in { - foreach AS = [GlobalAS, LocalAS, PrivateAS] in { +multiclass VloadVstore<list<AddressSpace> addrspaces, bit defStores> { + foreach AS = addrspaces in { foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vload" # VSize] in { def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>; @@ -801,116 +793,45 @@ def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>; def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } - foreach name = ["vstore" # VSize] in { - def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, AS>]>; - def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, AS>]>; - def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, AS>]>; - def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, AS>]>; - def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, AS>]>; - def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, AS>]>; - def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, AS>]>; - def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, AS>]>; - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, AS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, AS>]>; - def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, AS>]>; - } foreach name = ["vloada_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } - foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - foreach name = ["vstorea_half" # VSize # rnd] in { - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; + if defStores then { + foreach name = ["vstore" # VSize] in { + def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, AS>]>; + def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, AS>]>; + def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, AS>]>; + def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, AS>]>; + def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, AS>]>; + def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, AS>]>; + def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, AS>]>; + def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, AS>]>; + def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, AS>]>; + def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, AS>]>; + def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, AS>]>; + } + foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { + foreach name = ["vstorea_half" # VSize # rnd] in { + def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; + def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; + } } } } } } -// Variants for OpenCL versions above 2.0, using pointers to the generic -// address space. -let MinVersion = CL20 in { - foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vload" # VSize] in { - def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>; - def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>; - def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>; - def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>; - def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>; - def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>; - def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>; - def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>; - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>; - def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>; - def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; - } - foreach name = ["vstore" # VSize] in { - def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, GenericAS>]>; - def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, GenericAS>]>; - } - foreach name = ["vloada_half" # VSize] in { - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; - } - foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - foreach name = ["vstorea_half" # VSize # rnd] in { - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, GenericAS>]>; - } - } - } -} -// Variants using pointers to the constant address space. -foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vload" # VSize] in { - def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, ConstantAS>]>; - def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, ConstantAS>]>; - def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, ConstantAS>]>; - def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, ConstantAS>]>; - def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, ConstantAS>]>; - def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, ConstantAS>]>; - def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, ConstantAS>]>; - def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, ConstantAS>]>; - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, ConstantAS>]>; - def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, ConstantAS>]>; - def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>; - } - foreach name = ["vloada_half" # VSize] in { - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>; - } -} + let MaxVersion = CL20 in { - foreach AS = [GlobalAS, LocalAS, PrivateAS] in { - def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; - def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; - foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vload_half" # VSize] in { - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; - } - } - foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in { - def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>; - def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>; - } - foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vstore_half" # VSize # rnd] in { - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; - } - } - } - } + defm : VloadVstore<[GlobalAS, LocalAS, PrivateAS], 1>; } let MinVersion = CL20 in { - foreach AS = [GenericAS] in { + defm : VloadVstore<[GenericAS], 1>; +} +// vload with constant address space is available regardless of version. +defm : VloadVstore<[ConstantAS], 0>; + +multiclass VloadVstoreHalf<list<AddressSpace> addrspaces, bit defStores> { + foreach AS = addrspaces in { def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; foreach VSize = [2, 3, 4, 8, 16] in { @@ -918,30 +839,31 @@ def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } } - foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in { - def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>; - def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>; - } - foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vstore_half" # VSize # rnd] in { - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; + if defStores then { + foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { + foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in { + def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>; + def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>; + } + foreach VSize = [2, 3, 4, 8, 16] in { + foreach name = ["vstore_half" # VSize # rnd] in { + def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; + def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; + } } } } } } -foreach AS = [ConstantAS] in { - def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; - def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; - foreach VSize = [2, 3, 4, 8, 16] in { - foreach name = ["vload_half" # VSize] in { - def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; - } - } +let MaxVersion = CL20 in { + defm : VloadVstoreHalf<[GlobalAS, LocalAS, PrivateAS], 1>; +} +let MinVersion = CL20 in { + defm : VloadVstoreHalf<[GenericAS], 1>; } +// vload with constant address space is available regardless of version. +defm : VloadVstoreHalf<[ConstantAS], 0>; // OpenCL v3.0 s6.15.8 - Synchronization Functions. def : Builtin<"barrier", [Void, MemFenceFlags], Attr.Convergent>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits