Skip to content

Commit 4fdbfae

Browse files
Artem Gindinsonvmaksimo
Artem Gindinson
authored andcommitted
Support the SPV_EXT_shader_atomic_float_add extension
The new `AtomicFAddEXT` instruction will be mapped onto `__spirv_AtomicFAddEXT()` external calls in LLVM IR. No additional logic is required to facilitate this - the existing infrastructure does the replacement by default based on the `__spirv` prefix. The full specification can be found at github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/EXT/SPV_EXT_shader_atomic_float_add.asciidoc Signed-off-by: Artem Gindinson <artem.gindinson@intel.com>
1 parent c3485f8 commit 4fdbfae

File tree

6 files changed

+154
-5
lines changed

6 files changed

+154
-5
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#error "EXT macro must be defined"
44
#endif
55

6+
EXT(SPV_EXT_shader_atomic_float_add)
67
EXT(SPV_KHR_no_integer_wrap_decoration)
78
EXT(SPV_KHR_float_controls)
89
EXT(SPV_INTEL_subgroups)

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2721,30 +2721,51 @@ _SPIRV_OP(PowN, true, 10)
27212721

27222722
class SPIRVAtomicInstBase : public SPIRVInstTemplateBase {
27232723
public:
2724+
llvm::Optional<ExtensionID> getRequiredExtension() const override {
2725+
if (getOpCode() == OpAtomicFAddEXT)
2726+
return ExtensionID::SPV_EXT_shader_atomic_float_add;
2727+
return {};
2728+
}
2729+
27242730
SPIRVCapVec getRequiredCapability() const override {
27252731
SPIRVCapVec CapVec;
2726-
// Most of atomic instructions do not require any capabilities
2727-
// ... unless they operate on 64-bit integers.
2728-
if (hasType() && getType()->isTypeInt(64)) {
2732+
if (!hasType())
2733+
return CapVec;
2734+
2735+
// Most atomic instructionsrequire a specific capability when
2736+
// operating on 64-bit integers.
2737+
if (getType()->isTypeInt(64)) {
27292738
// In SPIRV 1.2 spec only 2 atomic instructions have no result type:
27302739
// 1. OpAtomicStore - need to check type of the Value operand
27312740
// 2. OpAtomicFlagClear - doesn't require Int64Atomics capability.
27322741
CapVec.push_back(CapabilityInt64Atomics);
2742+
} else if (getOpCode() == OpAtomicFAddEXT) {
2743+
if (getType()->isTypeFloat(32))
2744+
CapVec.push_back(CapabilityAtomicFloat32AddEXT);
2745+
else if (getType()->isTypeFloat(64))
2746+
CapVec.push_back(CapabilityAtomicFloat64AddEXT);
2747+
else
2748+
llvm_unreachable(
2749+
"AtomicFAddEXT can only be generated for f32 or f64 types");
27332750
}
27342751
// Per the spec OpAtomicCompareExchangeWeak, OpAtomicFlagTestAndSet and
27352752
// OpAtomicFlagClear instructions require kernel capability. But this
27362753
// capability should be added by setting OpenCL memory model.
27372754
return CapVec;
27382755
}
27392756

2740-
// Overriding the following method only because of OpAtomicStore.
2741-
// We have to declare Int64Atomics capability if the Value operand is int64.
2757+
// Overriding the following method because of particular OpAtomic*
2758+
// instructions. We may have to declare additional capabilities,
2759+
// e.g. based on operand types.
27422760
void setOpWords(const std::vector<SPIRVWord> &TheOps) override {
27432761
SPIRVInstTemplateBase::setOpWords(TheOps);
27442762
static const unsigned ValueOperandIndex = 3;
27452763
if (getOpCode() == OpAtomicStore &&
27462764
getOperand(ValueOperandIndex)->getType()->isTypeInt(64))
27472765
Module->addCapability(CapabilityInt64Atomics);
2766+
if (getOpCode() == OpAtomicFAddEXT)
2767+
for (auto RC : getRequiredCapability())
2768+
Module->addCapability(RC);
27482769
}
27492770
};
27502771

@@ -2769,6 +2790,7 @@ _SPIRV_OP(AtomicSMax, true, 7)
27692790
_SPIRV_OP(AtomicAnd, true, 7)
27702791
_SPIRV_OP(AtomicOr, true, 7)
27712792
_SPIRV_OP(AtomicXor, true, 7)
2793+
_SPIRV_OP(AtomicFAddEXT, true, 7)
27722794
_SPIRV_OP(MemoryBarrier, false, 3)
27732795
#undef _SPIRV_OP
27742796

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
454454
"PhysicalStorageBufferAddresses");
455455
add(CapabilityPhysicalStorageBufferAddressesEXT,
456456
"PhysicalStorageBufferAddressesEXT");
457+
add(CapabilityAtomicFloat32AddEXT, "AtomicFloat32AddEXT");
458+
add(CapabilityAtomicFloat64AddEXT, "AtomicFloat64AddEXT");
457459
add(CapabilityComputeDerivativeGroupLinearNV,
458460
"ComputeDerivativeGroupLinearNV");
459461
add(CapabilityCooperativeMatrixNV, "CooperativeMatrixNV");

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,4 +528,5 @@ _SPIRV_OP(CrossWorkgroupCastToPtrINTEL, 5938)
528528
_SPIRV_OP(ReadPipeBlockingINTEL, 5946)
529529
_SPIRV_OP(WritePipeBlockingINTEL, 5947)
530530
_SPIRV_OP(FPGARegINTEL, 5949)
531+
_SPIRV_OP(AtomicFAddEXT, 6035)
531532
_SPIRV_OP(TypeBufferSurfaceINTEL, 6086)

llvm-spirv/lib/SPIRV/libSPIRV/spirv.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,8 @@ enum Capability {
991991
CapabilityUSMStorageClassesINTEL = 5935,
992992
CapabilityFPGAMemoryAccessesINTEL = 5898,
993993
CapabilityIOPipeINTEL = 5943,
994+
CapabilityAtomicFloat32AddEXT = 6033,
995+
CapabilityAtomicFloat64AddEXT = 6034,
994996
CapabilityMax = 0x7fffffff,
995997
};
996998

@@ -1589,6 +1591,7 @@ enum Op {
15891591
OpReadPipeBlockingINTEL = 5946,
15901592
OpWritePipeBlockingINTEL = 5947,
15911593
OpFPGARegINTEL = 5949,
1594+
OpAtomicFAddEXT = 6035,
15921595
OpTypeBufferSurfaceINTEL = 6086,
15931596
OpMax = 0x7fffffff,
15941597
};
@@ -1989,6 +1992,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
19891992
case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;
19901993
case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;
19911994
case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;
1995+
case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;
19921996
case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;
19931997
case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;
19941998
case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;

llvm-spirv/test/AtomicFAddExt.ll

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_shader_atomic_float_add -o %t.spv
3+
; RUN: llvm-spirv -to-text %t.spv -o %t.spt
4+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
5+
6+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
7+
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown-sycldevice"
11+
12+
%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
13+
%"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" = type { [1 x i64] }
14+
%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
15+
16+
$_ZTSZZ3addIfEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37 = comdat any
17+
18+
$_ZTSZZ3addIdEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37 = comdat any
19+
20+
@__spirv_BuiltInGlobalInvocationId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32
21+
22+
; CHECK-SPIRV: Capability AtomicFloat32AddEXT
23+
; CHECK-SPIRV: Capability AtomicFloat64AddEXT
24+
; CHECK-SPIRV: Extension "SPV_EXT_shader_atomic_float_add"
25+
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
26+
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
27+
28+
; Function Attrs: convergent norecurse mustprogress
29+
define weak_odr dso_local spir_kernel void @_ZTSZZ3addIfEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37(float addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, float addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
30+
entry:
31+
%0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
32+
%1 = load i64, i64* %0, align 8
33+
%add.ptr.i29 = getelementptr inbounds float, float addrspace(1)* %_arg_, i64 %1
34+
%2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
35+
%3 = load i64, i64* %2, align 8
36+
%add.ptr.i = getelementptr inbounds float, float addrspace(1)* %_arg_4, i64 %3
37+
%4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !5
38+
%5 = extractelement <3 x i64> %4, i64 0
39+
; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_32]]
40+
; CHECK-LLVM: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+]]({{.*}})
41+
%call3.i.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFAddEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %add.ptr.i29, i32 1, i32 896, float 1.000000e+00) #2
42+
%add.i.i = fadd float %call3.i.i.i.i, 1.000000e+00
43+
%sext.i = shl i64 %5, 32
44+
%conv5.i = ashr exact i64 %sext.i, 32
45+
%ptridx.i.i = getelementptr inbounds float, float addrspace(1)* %add.ptr.i, i64 %conv5.i
46+
%ptridx.ascast.i.i = addrspacecast float addrspace(1)* %ptridx.i.i to float addrspace(4)*
47+
store float %add.i.i, float addrspace(4)* %ptridx.ascast.i.i, align 4, !tbaa !14
48+
ret void
49+
}
50+
51+
; Function Attrs: convergent
52+
; CHECK-LLVM: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float addrspace(1)*, i32, i32, float)
53+
declare dso_local spir_func float @_Z21__spirv_AtomicFAddEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)*, i32, i32, float) local_unnamed_addr #1
54+
55+
; Function Attrs: convergent norecurse mustprogress
56+
define weak_odr dso_local spir_kernel void @_ZTSZZ3addIdEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37(double addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, double addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
57+
entry:
58+
%0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
59+
%1 = load i64, i64* %0, align 8
60+
%add.ptr.i29 = getelementptr inbounds double, double addrspace(1)* %_arg_, i64 %1
61+
%2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
62+
%3 = load i64, i64* %2, align 8
63+
%add.ptr.i = getelementptr inbounds double, double addrspace(1)* %_arg_4, i64 %3
64+
%4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !18
65+
%5 = extractelement <3 x i64> %4, i64 0
66+
; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_64]]
67+
; CHECK-LLVM: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+]]({{.*}})
68+
%call3.i.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFAddEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %add.ptr.i29, i32 1, i32 896, double 1.000000e+00) #2
69+
%add.i.i = fadd double %call3.i.i.i.i, 1.000000e+00
70+
%sext.i = shl i64 %5, 32
71+
%conv5.i = ashr exact i64 %sext.i, 32
72+
%ptridx.i.i = getelementptr inbounds double, double addrspace(1)* %add.ptr.i, i64 %conv5.i
73+
%ptridx.ascast.i.i = addrspacecast double addrspace(1)* %ptridx.i.i to double addrspace(4)*
74+
store double %add.i.i, double addrspace(4)* %ptridx.ascast.i.i, align 8, !tbaa !27
75+
ret void
76+
}
77+
78+
; Function Attrs: convergent
79+
; CHECK-LLVM: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double addrspace(1)*, i32, i32, double)
80+
declare dso_local spir_func double @_Z21__spirv_AtomicFAddEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)*, i32, i32, double) local_unnamed_addr #1
81+
82+
attributes #0 = { convergent norecurse mustprogress "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "sycl-module-id"="fadd.cpp" "uniform-work-group-size"="true" "unsafe-fp-math"="false" "use-soft-float"="false" }
83+
attributes #1 = { convergent "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
84+
attributes #2 = { convergent nounwind }
85+
86+
!llvm.module.flags = !{!0}
87+
!opencl.spir.version = !{!1}
88+
!spirv.Source = !{!2}
89+
!llvm.ident = !{!3}
90+
91+
!0 = !{i32 1, !"wchar_size", i32 4}
92+
!1 = !{i32 1, i32 2}
93+
!2 = !{i32 4, i32 100000}
94+
!3 = !{!"clang version 12.0.0"}
95+
!4 = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1}
96+
!5 = !{!6, !8, !10, !12}
97+
!6 = distinct !{!6, !7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
98+
!7 = distinct !{!7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
99+
!8 = distinct !{!8, !9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
100+
!9 = distinct !{!9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
101+
!10 = distinct !{!10, !11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
102+
!11 = distinct !{!11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
103+
!12 = distinct !{!12, !13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
104+
!13 = distinct !{!13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
105+
!14 = !{!15, !15, i64 0}
106+
!15 = !{!"float", !16, i64 0}
107+
!16 = !{!"omnipotent char", !17, i64 0}
108+
!17 = !{!"Simple C++ TBAA"}
109+
!18 = !{!19, !21, !23, !25}
110+
!19 = distinct !{!19, !20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
111+
!20 = distinct !{!20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
112+
!21 = distinct !{!21, !22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
113+
!22 = distinct !{!22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
114+
!23 = distinct !{!23, !24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
115+
!24 = distinct !{!24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
116+
!25 = distinct !{!25, !26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
117+
!26 = distinct !{!26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
118+
!27 = !{!28, !28, i64 0}
119+
!28 = !{!"double", !16, i64 0}

0 commit comments

Comments
 (0)