diff --git a/clang/lib/Sema/SPIRVBuiltins.td b/clang/lib/Sema/SPIRVBuiltins.td index 2e46b37cf6974..bba559f0f255a 100644 --- a/clang/lib/Sema/SPIRVBuiltins.td +++ b/clang/lib/Sema/SPIRVBuiltins.td @@ -358,6 +358,8 @@ def Vec1234 : IntList<"Vec1234", [1, 2, 3, 4]>; // Type lists. def TLAll : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong, Float, Double, Half]>; def TLAllUnsigned : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong, UInt, ULong, UShort]>; +def TLAllWithBool : TypeList<[Bool, Char, UChar, Short, UShort, Int, UInt, Long, + ULong, Float, Double, Half]>; def TLFloat : TypeList<[Float, Double, Half]>; // FIXME: handle properly char (signed or unsigned depending on host) def TLSignedInts : TypeList<[Char, Short, Int, Long]>; @@ -383,6 +385,10 @@ def TLAllInts : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULo def AGenType1 : GenericType<"AGenType1", TLAll, Vec1>; def AGenTypeN : GenericType<"AGenTypeN", TLAll, VecAndScalar>; def AGenTypeNNoScalar : GenericType<"AGenTypeNNoScalar", TLAll, VecNoScalar>; +def AGenTypeNWithBool + : GenericType<"AGenTypeNWithBool", TLAllWithBool, VecAndScalar>; +// Bool +def BoolGenTypeN : GenericType<"BoolGenTypeN", TypeList<[Bool]>, VecAndScalar>; // All integer def AIGenType1 : GenericType<"AIGenType1", TLAllInts, Vec1>; def AIGenTypeN : GenericType<"AIGenTypeN", TLAllInts, VecAndScalar>; @@ -395,6 +401,7 @@ def AI2UGenTypeN : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAnd def SGenTypeN : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>; // Unsigned integer def UGenTypeN : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>; +def UInt4 : GenericType<"UInt4", TypeList<[UInt]>, Vec4>; // Float def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>; // (u)int, (u)long, and all floats @@ -976,3 +983,92 @@ foreach name = ["GroupSMin", "GroupSMax"] in { foreach name = ["GroupLogicalAndKHR", "GroupLogicalOrKHR"] in { def : SPVBuiltin; } + +// 3.56.24. Non-Uniform Instructions + +foreach name = ["GroupNonUniformElect"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformAll", "GroupNonUniformAny"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformAllEqual"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformBroadcast"] in { + foreach IDType = [UInt, ULong] in { + def : SPVBuiltin; + } +} + +foreach name = ["GroupNonUniformBroadcastFirst"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformBallot"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformInverseBallot"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformBallotBitExtract"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformBallotBitCount", "GroupNonUniformBallotFindLSB", + "GroupNonUniformBallotFindMSB"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformShuffle", "GroupNonUniformShuffleXor", + "GroupNonUniformShuffleUp", "GroupNonUniformShuffleDown"] in { + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformIAdd", "GroupNonUniformIMul"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformSMin", "GroupNonUniformSMax"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformUMin", "GroupNonUniformUMax"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformFAdd", "GroupNonUniformFMul", + "GroupNonUniformFMin", "GroupNonUniformFMax"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformBitwiseAnd", "GroupNonUniformBitwiseOr", + "GroupNonUniformBitwiseXor"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} + +foreach name = ["GroupNonUniformLogicalAnd", "GroupNonUniformLogicalOr", + "GroupNonUniformLogicalXor"] in { + def : SPVBuiltin; + def : SPVBuiltin; +} diff --git a/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group-non-uniform.cpp b/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group-non-uniform.cpp new file mode 100644 index 0000000000000..08001cdda8bab --- /dev/null +++ b/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group-non-uniform.cpp @@ -0,0 +1,387 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fdeclare-spirv-builtins -emit-llvm %s -o - | FileCheck %s + +bool group_elect() { return __spirv_GroupNonUniformElect(2); } + +bool group_all(bool predicate) { + return __spirv_GroupNonUniformAll(2, predicate); +} + +bool group_any(bool predicate) { + return __spirv_GroupNonUniformAny(2, predicate); +} + +template bool group_all_equal(T v) { + return __spirv_GroupNonUniformAllEqual(2, v); +} + +template T group_broad_cast(T v, unsigned int id) { + return __spirv_GroupNonUniformBroadcast(2, v, id); +} + +template T group_broad_cast_first(T v) { + return __spirv_GroupNonUniformBroadcastFirst(2, v); +} + +typedef unsigned int uint4 __attribute__((ext_vector_type(4))); + +uint4 group_ballot(char v) { return __spirv_GroupNonUniformBallot(2, false); } + +bool group_inverse_ballot(uint4 v) { + return __spirv_GroupNonUniformInverseBallot(2, v); +} + +bool group_ballot_bit_extract(uint4 v, unsigned int id) { + return __spirv_GroupNonUniformBallotBitExtract(2, v, id); +} + +unsigned int group_ballot_bit_count(uint4 v) { + return __spirv_GroupNonUniformBallotBitCount(2, 0, v); +} + +unsigned int group_ballot_find_lsb(uint4 v) { + return __spirv_GroupNonUniformBallotFindLSB(2, 0, v); +} + +unsigned int group_ballot_find_msb(uint4 v) { + return __spirv_GroupNonUniformBallotFindMSB(2, 0, v); +} + +template T group_shuffle(T v, unsigned int id) { + return __spirv_GroupNonUniformShuffle(2, v, id); +} + +template T group_shuffle_xor(T v, unsigned int id) { + return __spirv_GroupNonUniformShuffleXor(2, v, id); +} + +template T group_shuffle_up(T v, unsigned int id) { + return __spirv_GroupNonUniformShuffleUp(2, v, id); +} + +template T group_shuffle_down(T v, unsigned int id) { + return __spirv_GroupNonUniformShuffleDown(2, v, id); +} + +template T group_iadd(T v, unsigned int id) { + return __spirv_GroupNonUniformIAdd(2, 0, v) + + __spirv_GroupNonUniformIAdd(2, 0, v, id); +} + +template T group_imul(T v, unsigned int id) { + return __spirv_GroupNonUniformIMul(2, 0, v) + + __spirv_GroupNonUniformIMul(2, 0, v, id); +} + +template T group_fadd(T v, unsigned int id) { + return __spirv_GroupNonUniformFAdd(2, 1, v) + + __spirv_GroupNonUniformFAdd(2, 1, v, id); +} + +template T group_fmin(T v, unsigned int id) { + return __spirv_GroupNonUniformFMin(2, 0, v) + + __spirv_GroupNonUniformFMin(2, 0, v, id); +} + +template T group_fmax(T v, unsigned int id) { + return __spirv_GroupNonUniformFMax(2, 0, v) + + __spirv_GroupNonUniformFMax(2, 0, v, id); +} + +template T group_fmul(T v, unsigned int id) { + return __spirv_GroupNonUniformFMul(2, 0, v) + + __spirv_GroupNonUniformFMul(2, 0, v, id); +} + +template T group_umin(T v, unsigned int id) { + return __spirv_GroupNonUniformUMin(2, 0, v) + + __spirv_GroupNonUniformUMin(2, 0, v, id); +} + +template T group_umax(T v, unsigned int id) { + return __spirv_GroupNonUniformUMax(2, 0, v) + + __spirv_GroupNonUniformUMax(2, 0, v, id); +} + +template T group_smin(T v, unsigned int id) { + return __spirv_GroupNonUniformSMin(2, 0, v) + + __spirv_GroupNonUniformSMin(2, 0, v, id); +} + +template T group_smax(T v, unsigned int id) { + return __spirv_GroupNonUniformSMax(2, 0, v) + + __spirv_GroupNonUniformSMax(2, 0, v, id); +} + +template T group_bitwise_and(T v, unsigned int id) { + return __spirv_GroupNonUniformBitwiseAnd(2, 0, v) + + __spirv_GroupNonUniformBitwiseAnd(2, 0, v, id); +} + +template T group_bitwise_or(T v, unsigned int id) { + return __spirv_GroupNonUniformBitwiseOr(2, 0, v) + + __spirv_GroupNonUniformBitwiseOr(2, 0, v, id); +} + +template T group_bitwise_xor(T v, unsigned int id) { + return __spirv_GroupNonUniformBitwiseXor(2, 0, v) + + __spirv_GroupNonUniformBitwiseXor(2, 0, v, id); +} + +template bool group_logical_and(bool v, unsigned int id) { + return __spirv_GroupNonUniformLogicalAnd(2, 0, v) + + __spirv_GroupNonUniformLogicalAnd(2, 0, v, id); +} + +template bool group_logical_or(bool v, unsigned int id) { + return __spirv_GroupNonUniformLogicalOr(2, 0, v) + + __spirv_GroupNonUniformLogicalOr(2, 0, v, id); +} + +template bool group_logical_xor(bool v, unsigned int id) { + return __spirv_GroupNonUniformLogicalXor(2, 0, v) + + __spirv_GroupNonUniformLogicalXor(2, 0, v, id); +} + +template void test_with_bool() { + T v = 0; + unsigned int id = 0; + group_all_equal(v); + group_broad_cast(v, id); + group_broad_cast_first(v); + group_shuffle(v, id); + group_shuffle_xor(v, id); + group_shuffle_up(v, id); + group_shuffle_down(v, id); +} + +template void test_integer() { + T v = 0; + unsigned int id = 0; + group_iadd(v, id); + group_imul(v, id); + group_bitwise_and(v, id); + group_bitwise_or(v, id); + group_bitwise_xor(v, id); +} + +template void test_signed() { + T v = 0; + unsigned int id = 0; + group_smin(v, id); + group_smax(v, id); +} + +template void test_unsigned() { + T v = 0; + unsigned int id = 0; + group_umin(v, id); + group_umax(v, id); +} + +template void test_logical() { + T v = 0; + unsigned int id = 0; + group_logical_and(v, id); + group_logical_or(v, id); + group_logical_xor(v, id); +} + +void test() { + test_with_bool(); + test_with_bool(); + test_with_bool(); + test_with_bool(); + test_with_bool(); + test_with_bool(); + test_with_bool(); + test_with_bool<_Float16>(); + test_with_bool(); + test_with_bool(); + + test_integer(); + test_integer(); + test_integer(); + test_integer(); + test_integer(); + test_integer(); + + test_signed(); + test_signed(); + test_signed(); + + test_unsigned(); + test_unsigned(); + test_unsigned(); + + test_logical(); +} + +// CHECK: call noundef zeroext i1 @_Z28__spirv_GroupNonUniformElecti +// CHECK: call noundef zeroext i1 @_Z26__spirv_GroupNonUniformAllib +// CHECK: call noundef zeroext i1 @_Z26__spirv_GroupNonUniformAnyib +// CHECK: call noundef <4 x i32> @_Z29__spirv_GroupNonUniformBallotib +// CHECK: call noundef zeroext i1 @_Z36__spirv_GroupNonUniformInverseBallotiDv4_j +// CHECK: call noundef zeroext i1 @_Z39__spirv_GroupNonUniformBallotBitExtractiDv4_jj +// CHECK: call noundef i32 @_Z37__spirv_GroupNonUniformBallotBitCountiiDv4_j +// CHECK: call noundef i32 @_Z36__spirv_GroupNonUniformBallotFindLSBiiDv4_j +// CHECK: call noundef i32 @_Z36__spirv_GroupNonUniformBallotFindMSBiiDv4_j +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualib +// CHECK: call noundef zeroext i1 @_Z32__spirv_GroupNonUniformBroadcastibj +// CHECK: call noundef zeroext i1 @_Z37__spirv_GroupNonUniformBroadcastFirstib +// CHECK: call noundef zeroext i1 @_Z30__spirv_GroupNonUniformShuffleibj +// CHECK: call noundef zeroext i1 @_Z33__spirv_GroupNonUniformShuffleXoribj +// CHECK: call noundef zeroext i1 @_Z32__spirv_GroupNonUniformShuffleUpibj +// CHECK: call noundef zeroext i1 @_Z34__spirv_GroupNonUniformShuffleDownibj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualii +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBroadcastiij +// CHECK: call noundef i32 @_Z37__spirv_GroupNonUniformBroadcastFirstii +// CHECK: call noundef i32 @_Z30__spirv_GroupNonUniformShuffleiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformShuffleXoriij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformShuffleUpiij +// CHECK: call noundef i32 @_Z34__spirv_GroupNonUniformShuffleDowniij +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualih +// CHECK: call noundef zeroext i8 @_Z32__spirv_GroupNonUniformBroadcastihj +// CHECK: call noundef zeroext i8 @_Z37__spirv_GroupNonUniformBroadcastFirstih +// CHECK: call noundef zeroext i8 @_Z30__spirv_GroupNonUniformShuffleihj +// CHECK: call noundef zeroext i8 @_Z33__spirv_GroupNonUniformShuffleXorihj +// CHECK: call noundef zeroext i8 @_Z32__spirv_GroupNonUniformShuffleUpihj +// CHECK: call noundef zeroext i8 @_Z34__spirv_GroupNonUniformShuffleDownihj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualis +// CHECK: call noundef signext i16 @_Z32__spirv_GroupNonUniformBroadcastisj +// CHECK: call noundef signext i16 @_Z37__spirv_GroupNonUniformBroadcastFirstis +// CHECK: call noundef signext i16 @_Z30__spirv_GroupNonUniformShuffleisj +// CHECK: call noundef signext i16 @_Z33__spirv_GroupNonUniformShuffleXorisj +// CHECK: call noundef signext i16 @_Z32__spirv_GroupNonUniformShuffleUpisj +// CHECK: call noundef signext i16 @_Z34__spirv_GroupNonUniformShuffleDownisj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualit +// CHECK: call noundef zeroext i16 @_Z32__spirv_GroupNonUniformBroadcastitj +// CHECK: call noundef zeroext i16 @_Z37__spirv_GroupNonUniformBroadcastFirstit +// CHECK: call noundef zeroext i16 @_Z30__spirv_GroupNonUniformShuffleitj +// CHECK: call noundef zeroext i16 @_Z33__spirv_GroupNonUniformShuffleXoritj +// CHECK: call noundef zeroext i16 @_Z32__spirv_GroupNonUniformShuffleUpitj +// CHECK: call noundef zeroext i16 @_Z34__spirv_GroupNonUniformShuffleDownitj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualii +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBroadcastiij +// CHECK: call noundef i32 @_Z37__spirv_GroupNonUniformBroadcastFirstii +// CHECK: call noundef i32 @_Z30__spirv_GroupNonUniformShuffleiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformShuffleXoriij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformShuffleUpiij +// CHECK: call noundef i32 @_Z34__spirv_GroupNonUniformShuffleDowniij +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBroadcastijj +// CHECK: call noundef i32 @_Z37__spirv_GroupNonUniformBroadcastFirstij +// CHECK: call noundef i32 @_Z30__spirv_GroupNonUniformShuffleijj +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformShuffleXorijj +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformShuffleUpijj +// CHECK: call noundef i32 @_Z34__spirv_GroupNonUniformShuffleDownijj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualiDF16_ +// CHECK: call noundef half @_Z32__spirv_GroupNonUniformBroadcastiDF16_j +// CHECK: call noundef half @_Z37__spirv_GroupNonUniformBroadcastFirstiDF16_ +// CHECK: call noundef half @_Z30__spirv_GroupNonUniformShuffleiDF16_j +// CHECK: call noundef half @_Z33__spirv_GroupNonUniformShuffleXoriDF16_j +// CHECK: call noundef half @_Z32__spirv_GroupNonUniformShuffleUpiDF16_j +// CHECK: call noundef half @_Z34__spirv_GroupNonUniformShuffleDowniDF16_j +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualif +// CHECK: call noundef float @_Z32__spirv_GroupNonUniformBroadcastifj +// CHECK: call noundef float @_Z37__spirv_GroupNonUniformBroadcastFirstif +// CHECK: call noundef float @_Z30__spirv_GroupNonUniformShuffleifj +// CHECK: call noundef float @_Z33__spirv_GroupNonUniformShuffleXorifj +// CHECK: call noundef float @_Z32__spirv_GroupNonUniformShuffleUpifj +// CHECK: call noundef float @_Z34__spirv_GroupNonUniformShuffleDownifj +// CHECK: call noundef zeroext i1 @_Z31__spirv_GroupNonUniformAllEqualid +// CHECK: call noundef double @_Z32__spirv_GroupNonUniformBroadcastidj +// CHECK: call noundef double @_Z37__spirv_GroupNonUniformBroadcastFirstid +// CHECK: call noundef double @_Z30__spirv_GroupNonUniformShuffleidj +// CHECK: call noundef double @_Z33__spirv_GroupNonUniformShuffleXoridj +// CHECK: call noundef double @_Z32__spirv_GroupNonUniformShuffleUpidj +// CHECK: call noundef double @_Z34__spirv_GroupNonUniformShuffleDownidj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiii +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiiij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriii +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriii +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriiij +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformIAddiih +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformIAddiihj +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformIMuliih +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformIMuliihj +// CHECK: call noundef zeroext i8 @_Z33__spirv_GroupNonUniformBitwiseAndiih +// CHECK: call noundef zeroext i8 @_Z33__spirv_GroupNonUniformBitwiseAndiihj +// CHECK: call noundef zeroext i8 @_Z32__spirv_GroupNonUniformBitwiseOriih +// CHECK: call noundef zeroext i8 @_Z32__spirv_GroupNonUniformBitwiseOriihj +// CHECK: call noundef zeroext i8 @_Z33__spirv_GroupNonUniformBitwiseXoriih +// CHECK: call noundef zeroext i8 @_Z33__spirv_GroupNonUniformBitwiseXoriihj +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformIAddiis +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformIAddiisj +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformIMuliis +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformIMuliisj +// CHECK: call noundef signext i16 @_Z33__spirv_GroupNonUniformBitwiseAndiis +// CHECK: call noundef signext i16 @_Z33__spirv_GroupNonUniformBitwiseAndiisj +// CHECK: call noundef signext i16 @_Z32__spirv_GroupNonUniformBitwiseOriis +// CHECK: call noundef signext i16 @_Z32__spirv_GroupNonUniformBitwiseOriisj +// CHECK: call noundef signext i16 @_Z33__spirv_GroupNonUniformBitwiseXoriis +// CHECK: call noundef signext i16 @_Z33__spirv_GroupNonUniformBitwiseXoriisj +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformIAddiit +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformIAddiitj +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformIMuliit +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformIMuliitj +// CHECK: call noundef zeroext i16 @_Z33__spirv_GroupNonUniformBitwiseAndiit +// CHECK: call noundef zeroext i16 @_Z33__spirv_GroupNonUniformBitwiseAndiitj +// CHECK: call noundef zeroext i16 @_Z32__spirv_GroupNonUniformBitwiseOriit +// CHECK: call noundef zeroext i16 @_Z32__spirv_GroupNonUniformBitwiseOriitj +// CHECK: call noundef zeroext i16 @_Z33__spirv_GroupNonUniformBitwiseXoriit +// CHECK: call noundef zeroext i16 @_Z33__spirv_GroupNonUniformBitwiseXoriitj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiii +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiiij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriii +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriii +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIAddiijj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformIMuliijj +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseAndiijj +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriij +// CHECK: call noundef i32 @_Z32__spirv_GroupNonUniformBitwiseOriijj +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriij +// CHECK: call noundef i32 @_Z33__spirv_GroupNonUniformBitwiseXoriijj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMiniii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMiniiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMaxiii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMaxiiij +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformSMiniis +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformSMiniisj +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformSMaxiis +// CHECK: call noundef signext i16 @_Z27__spirv_GroupNonUniformSMaxiisj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMiniii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMiniiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMaxiii +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformSMaxiiij +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformUMiniih +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformUMiniihj +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformUMaxiih +// CHECK: call noundef zeroext i8 @_Z27__spirv_GroupNonUniformUMaxiihj +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformUMiniit +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformUMiniitj +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformUMaxiit +// CHECK: call noundef zeroext i16 @_Z27__spirv_GroupNonUniformUMaxiitj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformUMiniij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformUMiniijj +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformUMaxiij +// CHECK: call noundef i32 @_Z27__spirv_GroupNonUniformUMaxiijj +// CHECK: call noundef zeroext i1 @_Z33__spirv_GroupNonUniformLogicalAndiib +// CHECK: call noundef zeroext i1 @_Z33__spirv_GroupNonUniformLogicalAndiibj +// CHECK: call noundef zeroext i1 @_Z32__spirv_GroupNonUniformLogicalOriib +// CHECK: call noundef zeroext i1 @_Z32__spirv_GroupNonUniformLogicalOriibj +// CHECK: call noundef zeroext i1 @_Z33__spirv_GroupNonUniformLogicalXoriib +// CHECK: call noundef zeroext i1 @_Z33__spirv_GroupNonUniformLogicalXoriibj diff --git a/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group.cl b/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group.cl index 0a31736f04122..52872bf7ac3b9 100644 --- a/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group.cl +++ b/clang/test/CodeGenSPIRV/spirv-builtin-lookup-group.cl @@ -43,7 +43,7 @@ int group_imul_khr(short a) { return __spirv_GroupIMulKHR(2, 0, a); } -bool group_bitwise_or_khr(long a) { +long group_bitwise_or_khr(long a) { // CHECK-LABEL: @group_bitwise_or_khr( // CHECK: call spir_func i64 @_Z25__spirv_GroupBitwiseOrKHRiil( return __spirv_GroupBitwiseOrKHR(2, 0, a); @@ -67,8 +67,8 @@ float group_fmax(float a) { return __spirv_GroupFMax(2, 2, a); } -float group_ful_khr(float a) { - // CHECK-LABEL: @group_ful_khr( +float group_fmul_khr(float a) { + // CHECK-LABEL: @group_fmul_khr( // CHECK: call spir_func float @_Z20__spirv_GroupFMulKHRiif( return __spirv_GroupFMulKHR(2, 2, a); } diff --git a/libclc/libspirv/lib/amdgcn-amdhsa/group/group_ballot.cl b/libclc/libspirv/lib/amdgcn-amdhsa/group/group_ballot.cl index 49fa34a8cd7ab..f3cfa38615510 100644 --- a/libclc/libspirv/lib/amdgcn-amdhsa/group/group_ballot.cl +++ b/libclc/libspirv/lib/amdgcn-amdhsa/group/group_ballot.cl @@ -12,8 +12,8 @@ // from llvm/include/llvm/IR/InstrTypes.h #define ICMP_NE 33 -_CLC_DEF _CLC_CONVERGENT __clc_vec4_uint32_t -_Z29__spirv_GroupNonUniformBallotib(int flag, bool predicate) { +_CLC_OVERLOAD _CLC_DEF _CLC_CONVERGENT __clc_vec4_uint32_t +__spirv_GroupNonUniformBallot(int flag, bool predicate) { // only support subgroup for now if (flag != Subgroup) { __builtin_trap(); diff --git a/libclc/libspirv/lib/ptx-nvidiacl/group/group_non_uniform.cl b/libclc/libspirv/lib/ptx-nvidiacl/group/group_non_uniform.cl index 3474f17666080..afc1f3d8df81f 100644 --- a/libclc/libspirv/lib/ptx-nvidiacl/group/group_non_uniform.cl +++ b/libclc/libspirv/lib/ptx-nvidiacl/group/group_non_uniform.cl @@ -12,8 +12,8 @@ #include #include -_CLC_DEF _CLC_CONVERGENT __clc_vec4_uint32_t -_Z29__spirv_GroupNonUniformBallotib(int flag, bool predicate) { +_CLC_OVERLOAD _CLC_DEF _CLC_CONVERGENT __clc_vec4_uint32_t +__spirv_GroupNonUniformBallot(int flag, bool predicate) { // only support subgroup for now if (flag != Subgroup) { __builtin_trap(); @@ -36,8 +36,8 @@ _Z29__spirv_GroupNonUniformBallotib(int flag, bool predicate) { return res; } -_CLC_DEF _CLC_CONVERGENT uint -_Z37__spirv_GroupNonUniformBallotBitCountN5__spv5Scope4FlagEiDv4_j( +_CLC_OVERLOAD _CLC_DEF _CLC_CONVERGENT uint +__spirv_GroupNonUniformBallotBitCount( int scope, int flag, __clc_vec4_uint32_t mask) { // here we assume scope == __spv::Scope::Subgroup // flag == InclusiveScan is not yet implemented diff --git a/sycl/include/sycl/__spirv/spirv_ops.hpp b/sycl/include/sycl/__spirv/spirv_ops.hpp index 04cfec68e7679..4003b02485b87 100644 --- a/sycl/include/sycl/__spirv/spirv_ops.hpp +++ b/sycl/include/sycl/__spirv/spirv_ops.hpp @@ -881,157 +881,6 @@ template extern __DPCPP_SYCL_EXTERNAL __ocl_vec_t __spirv_ConvertFToBF16INTEL(__ocl_vec_t) noexcept; -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL - __SYCL_EXPORT __ocl_vec_t - __spirv_GroupNonUniformBallot(int32_t Execution, bool Predicate) noexcept; - -// TODO: I'm not 100% sure that these NonUniform instructions should be -// convergent Following precedent set for GroupNonUniformBallot above -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT uint32_t -__spirv_GroupNonUniformBallotBitCount(__spv::Scope::Flag, int, - __ocl_vec_t) noexcept; - -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT int - __spirv_GroupNonUniformBallotFindLSB(__spv::Scope::Flag, - __ocl_vec_t) noexcept; - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT - __spirv_GroupNonUniformBroadcast(__spv::Scope::Flag, ValueT, IdT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT - __spirv_GroupNonUniformShuffle(__spv::Scope::Flag, ValueT, IdT) noexcept; - -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT bool -__spirv_GroupNonUniformAll(__spv::Scope::Flag, bool); - -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT bool -__spirv_GroupNonUniformAny(__spv::Scope::Flag, bool); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformSMin(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformUMin(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMin(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformSMax(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformUMax(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMax(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformIAdd(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFAdd(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformIMul(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMul(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseOr(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseXor(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseAnd(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformLogicalOr(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformLogicalAnd(__spv::Scope::Flag, int, ValueT); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformSMin(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformUMin(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMin(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformSMax(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformUMax(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMax(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformIAdd(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFAdd(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformIMul(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformFMul(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseOr(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseXor(__spv::Scope::Flag, int, ValueT, - unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformBitwiseAnd(__spv::Scope::Flag, int, ValueT, - unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformLogicalOr(__spv::Scope::Flag, int, ValueT, unsigned int); - -template -__SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT ValueT -__spirv_GroupNonUniformLogicalAnd(__spv::Scope::Flag, int, ValueT, - unsigned int); - extern __DPCPP_SYCL_EXTERNAL __SYCL_EXPORT void __clc_BarrierInitialize(int64_t *state, int32_t expected_count) noexcept;