[llvm] [SPIR-V] Extend support for __spirv_ builtins (PR #117190)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 21 08:53:59 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Vyacheslav Levytskyy (VyacheslavLevytskyy)
<details>
<summary>Changes</summary>
This PR extends support for __spirv_ builtins by adding missed builtins (GroupNonUniformBroadcast) and supporting more "_R<type>" builtins.
---
Full diff: https://github.com/llvm/llvm-project/pull/117190.diff
3 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp (+29-7)
- (modified) llvm/lib/Target/SPIRV/SPIRVBuiltins.td (+2)
- (modified) llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll (+13-1)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 06a37f1f559d44..73dce230575d84 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 <regex>
#include <string>
#include <tuple>
@@ -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<type>", 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<type>".
+ // 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 1b95b1479bb932..e0dfc25723b0cc 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 a53bd8e53205ef..640dc273dfa62e 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)
``````````
</details>
https://github.com/llvm/llvm-project/pull/117190
More information about the llvm-commits
mailing list