forked from OSchip/llvm-project
[OpenCL] Reduce duplicate defs by using multiclasses; NFC
Builtin definitions with pointer arguments were duplicated to provide overloads differing in the pointer argument's address space. Reduce this duplication by capturing the definitions in multiclasses. This still results in the same number of builtins in the generated tables, but the description is more concise now. Differential Revision: https://reviews.llvm.org/D107151
This commit is contained in:
parent
55fd6f292f
commit
92b00ffe0f
|
@ -543,9 +543,10 @@ foreach name = ["fma", "mad"] in {
|
|||
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 {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ foreach name = ["select"] in {
|
|||
// 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,148 +793,78 @@ let MaxVersion = CL20 in {
|
|||
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>]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 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>]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let MinVersion = CL20 in {
|
||||
foreach AS = [GenericAS] 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>]>;
|
||||
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>]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 : VloadVstore<[GlobalAS, LocalAS, PrivateAS], 1>;
|
||||
}
|
||||
let MinVersion = CL20 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 {
|
||||
foreach name = ["vload_half" # VSize] in {
|
||||
def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<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>]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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>;
|
||||
let MinVersion = CL20 in {
|
||||
|
|
Loading…
Reference in New Issue