diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp index 06a37f1f559d4..73dce230575d8 100644 --- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/IntrinsicsSPIRV.h" +#include #include #include @@ -201,13 +202,34 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall) { BuiltinName = BuiltinName.substr(BuiltinName.find_last_of(' ') + 1); } - // Check if the extracted name begins with "__spirv_ImageSampleExplicitLod" - // contains return type information at the end "_R", if so extract the - // plain builtin name without the type information. - if (StringRef(BuiltinName).contains("__spirv_ImageSampleExplicitLod") && - StringRef(BuiltinName).contains("_R")) { - BuiltinName = BuiltinName.substr(0, BuiltinName.find("_R")); - } + // Check if the extracted name begins with: + // - "__spirv_ImageSampleExplicitLod" + // - "__spirv_ImageRead" + // - "__spirv_ImageQuerySizeLod" + // - "__spirv_UDotKHR" + // - "__spirv_SDotKHR" + // - "__spirv_SUDotKHR" + // - "__spirv_SDotAccSatKHR" + // - "__spirv_UDotAccSatKHR" + // - "__spirv_SUDotAccSatKHR" + // - "__spirv_ReadClockKHR" + // - "__spirv_SubgroupBlockReadINTEL" + // - "__spirv_SubgroupImageBlockReadINTEL" + // - "__spirv_Convert" + // - "__spirv_UConvert" + // - "__spirv_SConvert" + // - "__spirv_FConvert" + // - "__spirv_SatConvert" + // and contains return type information at the end "_R". + // If so, extract the plain builtin name without the type information. + static const std::regex SpvWithR( + "(__spirv_(ImageSampleExplicitLod|ImageRead|ImageQuerySizeLod|UDotKHR|" + "SDotKHR|SUDotKHR|SDotAccSatKHR|UDotAccSatKHR|SUDotAccSatKHR|" + "ReadClockKHR|SubgroupBlockReadINTEL|SubgroupImageBlockReadINTEL|Convert|" + "UConvert|SConvert|FConvert|SatConvert).*)_R.*"); + std::smatch Match; + if (std::regex_match(BuiltinName, Match, SpvWithR) && Match.size() > 2) + BuiltinName = Match[1].str(); return BuiltinName; } diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td index 1b95b1479bb93..e0dfc25723b0c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td +++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td @@ -794,7 +794,9 @@ defm : DemangledGroupBuiltinWrapper<"__spirv_GroupAny", 2, 2, OpGroupAny>; defm : DemangledGroupBuiltin<"group_broadcast", WorkOrSub, OpGroupBroadcast>; defm : DemangledGroupBuiltinWrapper<"__spirv_GroupBroadcast", 3, 3, OpGroupBroadcast>; defm : DemangledGroupBuiltin<"group_non_uniform_broadcast", OnlySub, OpGroupNonUniformBroadcast>; +defm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBroadcast", 3, 3, OpGroupNonUniformBroadcast>; defm : DemangledGroupBuiltin<"group_broadcast_first", OnlySub, OpGroupNonUniformBroadcastFirst>; +defm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBroadcastFirst", 2, 2, OpGroupNonUniformBroadcastFirst>; // cl_khr_subgroup_non_uniform_vote defm : DemangledGroupBuiltin<"group_elect", OnlySub, OpGroupNonUniformElect>; diff --git a/llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll b/llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll index a53bd8e53205e..640dc273dfa62 100644 --- a/llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll +++ b/llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll @@ -250,8 +250,12 @@ define <4 x i32> @u16tou32v4(<4 x i16> %a) { ; CHECK: %[[#]] = OpSatConvertUToS [[U64]] %[[#]] ; CHECK: %[[#]] = OpConvertPtrToU [[U64]] [[Arg1]] ; CHECK: %[[#]] = OpConvertUToPtr %[[#]] [[Arg2]] +; CHECK: %[[#]] = OpUConvert [[U32v4]] %[[#]] +; CHECK: %[[#]] = OpSConvert [[U32v4]] %[[#]] +; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]] +; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]] ; CHECK: OpFunctionEnd -define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr) { +define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr, <4 x i8> %arg_v2) { %r1 = call spir_func i32 @__spirv_ConvertFToU(float 0.000000e+00) %r2 = call spir_func i32 @__spirv_ConvertFToS(float 0.000000e+00) %r3 = call spir_func float @__spirv_ConvertSToF(i32 1) @@ -264,6 +268,10 @@ define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg %r10 = call spir_func i64 @__spirv_SatConvertUToS(i64 1) %r11 = call spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4) %arg) %r12 = call spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64 %arg_ptr) + %r13 = call spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8> %arg_v2) + %r14 = call spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8> %arg_v2) + %r15 = call spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr) + %r16 = call spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr) ret void } @@ -279,3 +287,7 @@ declare dso_local spir_func i64 @__spirv_SatConvertSToU(i64) declare dso_local spir_func i64 @__spirv_SatConvertUToS(i64) declare dso_local spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4)) declare dso_local spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64) +declare dso_local spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8>) +declare dso_local spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8>) +declare dso_local spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64) +declare dso_local spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64)