Skip to content

Commit 9b43078

Browse files
[SPIR-V] Extend support for __spirv_ builtins (#117190)
This PR extends support for `__spirv_` builtins by adding missed builtins (`GroupNonUniformBroadcast*`) and supporting more "_R<type>" builtins.
1 parent 6735c5e commit 9b43078

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/StringExtras.h"
1919
#include "llvm/Analysis/ValueTracking.h"
2020
#include "llvm/IR/IntrinsicsSPIRV.h"
21+
#include <regex>
2122
#include <string>
2223
#include <tuple>
2324

@@ -201,13 +202,34 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall) {
201202
BuiltinName = BuiltinName.substr(BuiltinName.find_last_of(' ') + 1);
202203
}
203204

204-
// Check if the extracted name begins with "__spirv_ImageSampleExplicitLod"
205-
// contains return type information at the end "_R<type>", if so extract the
206-
// plain builtin name without the type information.
207-
if (StringRef(BuiltinName).contains("__spirv_ImageSampleExplicitLod") &&
208-
StringRef(BuiltinName).contains("_R")) {
209-
BuiltinName = BuiltinName.substr(0, BuiltinName.find("_R"));
210-
}
205+
// Check if the extracted name begins with:
206+
// - "__spirv_ImageSampleExplicitLod"
207+
// - "__spirv_ImageRead"
208+
// - "__spirv_ImageQuerySizeLod"
209+
// - "__spirv_UDotKHR"
210+
// - "__spirv_SDotKHR"
211+
// - "__spirv_SUDotKHR"
212+
// - "__spirv_SDotAccSatKHR"
213+
// - "__spirv_UDotAccSatKHR"
214+
// - "__spirv_SUDotAccSatKHR"
215+
// - "__spirv_ReadClockKHR"
216+
// - "__spirv_SubgroupBlockReadINTEL"
217+
// - "__spirv_SubgroupImageBlockReadINTEL"
218+
// - "__spirv_Convert"
219+
// - "__spirv_UConvert"
220+
// - "__spirv_SConvert"
221+
// - "__spirv_FConvert"
222+
// - "__spirv_SatConvert"
223+
// and contains return type information at the end "_R<type>".
224+
// If so, extract the plain builtin name without the type information.
225+
static const std::regex SpvWithR(
226+
"(__spirv_(ImageSampleExplicitLod|ImageRead|ImageQuerySizeLod|UDotKHR|"
227+
"SDotKHR|SUDotKHR|SDotAccSatKHR|UDotAccSatKHR|SUDotAccSatKHR|"
228+
"ReadClockKHR|SubgroupBlockReadINTEL|SubgroupImageBlockReadINTEL|Convert|"
229+
"UConvert|SConvert|FConvert|SatConvert).*)_R.*");
230+
std::smatch Match;
231+
if (std::regex_match(BuiltinName, Match, SpvWithR) && Match.size() > 2)
232+
BuiltinName = Match[1].str();
211233

212234
return BuiltinName;
213235
}

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,9 @@ defm : DemangledGroupBuiltinWrapper<"__spirv_GroupAny", 2, 2, OpGroupAny>;
794794
defm : DemangledGroupBuiltin<"group_broadcast", WorkOrSub, OpGroupBroadcast>;
795795
defm : DemangledGroupBuiltinWrapper<"__spirv_GroupBroadcast", 3, 3, OpGroupBroadcast>;
796796
defm : DemangledGroupBuiltin<"group_non_uniform_broadcast", OnlySub, OpGroupNonUniformBroadcast>;
797+
defm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBroadcast", 3, 3, OpGroupNonUniformBroadcast>;
797798
defm : DemangledGroupBuiltin<"group_broadcast_first", OnlySub, OpGroupNonUniformBroadcastFirst>;
799+
defm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBroadcastFirst", 2, 2, OpGroupNonUniformBroadcastFirst>;
798800

799801
// cl_khr_subgroup_non_uniform_vote
800802
defm : DemangledGroupBuiltin<"group_elect", OnlySub, OpGroupNonUniformElect>;

llvm/test/CodeGen/SPIRV/instructions/integer-casts.ll

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,12 @@ define <4 x i32> @u16tou32v4(<4 x i16> %a) {
250250
; CHECK: %[[#]] = OpSatConvertUToS [[U64]] %[[#]]
251251
; CHECK: %[[#]] = OpConvertPtrToU [[U64]] [[Arg1]]
252252
; CHECK: %[[#]] = OpConvertUToPtr %[[#]] [[Arg2]]
253+
; CHECK: %[[#]] = OpUConvert [[U32v4]] %[[#]]
254+
; CHECK: %[[#]] = OpSConvert [[U32v4]] %[[#]]
255+
; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]
256+
; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]
253257
; CHECK: OpFunctionEnd
254-
define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr) {
258+
define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr, <4 x i8> %arg_v2) {
255259
%r1 = call spir_func i32 @__spirv_ConvertFToU(float 0.000000e+00)
256260
%r2 = call spir_func i32 @__spirv_ConvertFToS(float 0.000000e+00)
257261
%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
264268
%r10 = call spir_func i64 @__spirv_SatConvertUToS(i64 1)
265269
%r11 = call spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4) %arg)
266270
%r12 = call spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64 %arg_ptr)
271+
%r13 = call spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8> %arg_v2)
272+
%r14 = call spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8> %arg_v2)
273+
%r15 = call spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr)
274+
%r16 = call spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr)
267275
ret void
268276
}
269277

@@ -279,3 +287,7 @@ declare dso_local spir_func i64 @__spirv_SatConvertSToU(i64)
279287
declare dso_local spir_func i64 @__spirv_SatConvertUToS(i64)
280288
declare dso_local spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4))
281289
declare dso_local spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64)
290+
declare dso_local spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8>)
291+
declare dso_local spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8>)
292+
declare dso_local spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64)
293+
declare dso_local spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64)

0 commit comments

Comments
 (0)