Skip to content

Commit dde90d0

Browse files
AlexeySotkinvmaksimo
authored andcommitted
Add support for element-wise operations on joint matrix
Signed-off-by: Alexey Sotkin <[email protected]> Original commit: KhronosGroup/SPIRV-LLVM-Translator@ada2fd4
1 parent e4ee512 commit dde90d0

File tree

8 files changed

+162
-19
lines changed

8 files changed

+162
-19
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2160,10 +2160,14 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
21602160
}
21612161

21622162
case OpVectorExtractDynamic: {
2163-
auto CE = static_cast<SPIRVVectorExtractDynamic *>(BV);
2163+
auto *VED = static_cast<SPIRVVectorExtractDynamic *>(BV);
2164+
SPIRVValue *Vec = VED->getVector();
2165+
if (Vec->getType()->getOpCode() == internal::OpTypeJointMatrixINTEL) {
2166+
return mapValue(BV, transSPIRVBuiltinFromInst(VED, BB));
2167+
}
21642168
return mapValue(
2165-
BV, ExtractElementInst::Create(transValue(CE->getVector(), F, BB),
2166-
transValue(CE->getIndex(), F, BB),
2169+
BV, ExtractElementInst::Create(transValue(Vec, F, BB),
2170+
transValue(VED->getIndex(), F, BB),
21672171
BV->getName(), BB));
21682172
}
21692173

@@ -2189,12 +2193,15 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
21892193
}
21902194

21912195
case OpVectorInsertDynamic: {
2192-
auto CI = static_cast<SPIRVVectorInsertDynamic *>(BV);
2196+
auto *VID = static_cast<SPIRVVectorInsertDynamic *>(BV);
2197+
SPIRVValue *Vec = VID->getVector();
2198+
if (Vec->getType()->getOpCode() == internal::OpTypeJointMatrixINTEL) {
2199+
return mapValue(BV, transSPIRVBuiltinFromInst(VID, BB));
2200+
}
21932201
return mapValue(
2194-
BV, InsertElementInst::Create(transValue(CI->getVector(), F, BB),
2195-
transValue(CI->getComponent(), F, BB),
2196-
transValue(CI->getIndex(), F, BB),
2197-
BV->getName(), BB));
2202+
BV, InsertElementInst::Create(
2203+
transValue(Vec, F, BB), transValue(VID->getComponent(), F, BB),
2204+
transValue(VID->getIndex(), F, BB), BV->getName(), BB));
21982205
}
21992206

22002207
case OpVectorShuffle: {

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4334,6 +4334,14 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
43344334
return BM->addAsyncGroupCopy(BArgs[0], BArgs[1], BArgs[2], BArgs[3],
43354335
BArgs[4], BArgs[5], BB);
43364336
} break;
4337+
case OpVectorExtractDynamic: {
4338+
auto BArgs = transValue(getArguments(CI), BB);
4339+
return BM->addVectorExtractDynamicInst(BArgs[0], BArgs[1], BB);
4340+
} break;
4341+
case OpVectorInsertDynamic: {
4342+
auto BArgs = transValue(getArguments(CI), BB);
4343+
return BM->addVectorInsertDynamicInst(BArgs[0], BArgs[1], BArgs[2], BB);
4344+
} break;
43374345
case OpSampledImage: {
43384346
// Clang can generate SPIRV-friendly call for OpSampledImage instruction,
43394347
// i.e. __spirv_SampledImage... But it can't generate correct return type

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2092,14 +2092,18 @@ class SPIRVVectorExtractDynamic : public SPIRVInstruction {
20922092

20932093
SPIRVValue *getVector() { return getValue(VectorId); }
20942094
SPIRVValue *getIndex() const { return getValue(IndexId); }
2095+
std::vector<SPIRVValue *> getOperands() override {
2096+
return {getVector(), getIndex()};
2097+
}
20952098

20962099
protected:
20972100
_SPIRV_DEF_ENCDEC4(Type, Id, VectorId, IndexId)
20982101
void validate() const override {
20992102
SPIRVInstruction::validate();
21002103
if (getValue(VectorId)->isForward())
21012104
return;
2102-
assert(getValueType(VectorId)->isTypeVector());
2105+
assert(getValueType(VectorId)->isTypeVector() ||
2106+
getValueType(VectorId)->isTypeJointMatrixINTEL());
21032107
}
21042108
SPIRVId VectorId;
21052109
SPIRVId IndexId;
@@ -2124,16 +2128,20 @@ class SPIRVVectorInsertDynamic : public SPIRVInstruction {
21242128
IndexId(SPIRVID_INVALID), ComponentId(SPIRVID_INVALID) {}
21252129

21262130
SPIRVValue *getVector() { return getValue(VectorId); }
2127-
SPIRVValue *getIndex() const { return getValue(IndexId); }
21282131
SPIRVValue *getComponent() { return getValue(ComponentId); }
2132+
SPIRVValue *getIndex() const { return getValue(IndexId); }
2133+
std::vector<SPIRVValue *> getOperands() override {
2134+
return {getVector(), getComponent(), getIndex()};
2135+
}
21292136

21302137
protected:
21312138
_SPIRV_DEF_ENCDEC5(Type, Id, VectorId, ComponentId, IndexId)
21322139
void validate() const override {
21332140
SPIRVInstruction::validate();
21342141
if (getValue(VectorId)->isForward())
21352142
return;
2136-
assert(getValueType(VectorId)->isTypeVector());
2143+
assert(getValueType(VectorId)->isTypeVector() ||
2144+
getValueType(VectorId)->isTypeJointMatrixINTEL());
21372145
}
21382146
SPIRVId VectorId;
21392147
SPIRVId IndexId;
@@ -3292,6 +3300,7 @@ class SPIRVJointMatrixINTELInst : public SPIRVJointMatrixINTELInstBase {
32923300
_SPIRV_OP(JointMatrixLoad, true, 6, true)
32933301
_SPIRV_OP(JointMatrixStore, false, 5, true)
32943302
_SPIRV_OP(JointMatrixMad, true, 7)
3303+
_SPIRV_OP(JointMatrixWorkItemLength, true, 4)
32953304
#undef _SPIRV_OP
32963305
} // namespace SPIRV
32973306

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ _SPIRV_OP_INTERNAL(TypeJointMatrixINTEL, internal::OpTypeJointMatrixINTEL)
1212
_SPIRV_OP_INTERNAL(JointMatrixLoadINTEL, internal::OpJointMatrixLoadINTEL)
1313
_SPIRV_OP_INTERNAL(JointMatrixStoreINTEL, internal::OpJointMatrixStoreINTEL)
1414
_SPIRV_OP_INTERNAL(JointMatrixMadINTEL, internal::OpJointMatrixMadINTEL)
15+
_SPIRV_OP_INTERNAL(JointMatrixWorkItemLengthINTEL,
16+
internal::OpJointMatrixWorkItemLengthINTEL)

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVType.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,12 @@ SPIRVWord SPIRVType::getVectorComponentCount() const {
111111
}
112112

113113
SPIRVType *SPIRVType::getVectorComponentType() const {
114-
assert(OpCode == OpTypeVector && "Not vector type");
115-
return static_cast<const SPIRVTypeVector *>(this)->getComponentType();
114+
if (OpCode == OpTypeVector)
115+
return static_cast<const SPIRVTypeVector *>(this)->getComponentType();
116+
if (OpCode == internal::OpTypeJointMatrixINTEL)
117+
return static_cast<const SPIRVTypeJointMatrixINTEL *>(this)->getCompType();
118+
assert(0 && "getVectorComponentType(): Not a vector or joint matrix type");
119+
return nullptr;
116120
}
117121

118122
SPIRVWord SPIRVType::getMatrixColumnCount() const {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,11 +1081,11 @@ class SPIRVTypeJointMatrixINTEL : public SPIRVType {
10811081
SPIRVCapVec getRequiredCapability() const override {
10821082
return {internal::CapabilityJointMatrixINTEL};
10831083
}
1084-
SPIRVType *getCompType() { return CompType; }
1085-
SPIRVValue *getLayout() { return Layout; }
1086-
SPIRVValue *getRows() { return Rows; }
1087-
SPIRVValue *getColumns() { return Columns; }
1088-
SPIRVValue *getScope() { return Scope; }
1084+
SPIRVType *getCompType() const { return CompType; }
1085+
SPIRVValue *getLayout() const { return Layout; }
1086+
SPIRVValue *getRows() const { return Rows; }
1087+
SPIRVValue *getColumns() const { return Columns; }
1088+
SPIRVValue *getScope() const { return Scope; }
10891089
};
10901090

10911091
} // namespace SPIRV

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ enum InternalOp {
4646
IOpJointMatrixStoreINTEL = 6121,
4747
IOpJointMatrixMadINTEL = 6122,
4848
IOpArithmeticFenceINTEL = 6145,
49+
IOpJointMatrixWorkItemLengthINTEL = 6410,
4950
IOpPrev = OpMax - 2,
5051
IOpForward
5152
};
@@ -108,7 +109,7 @@ _SPIRV_OP(Op, TypeJointMatrixINTEL)
108109
_SPIRV_OP(Op, JointMatrixLoadINTEL)
109110
_SPIRV_OP(Op, JointMatrixStoreINTEL)
110111
_SPIRV_OP(Op, JointMatrixMadINTEL)
111-
112+
_SPIRV_OP(Op, JointMatrixWorkItemLengthINTEL)
112113
_SPIRV_OP(Capability, HWThreadQueryINTEL)
113114
_SPIRV_OP(BuiltIn, SubDeviceIDINTEL)
114115
_SPIRV_OP(BuiltIn, GlobalHWThreadIDINTEL)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
; RUN: llvm-as < %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-ext=+all -o %t.spv
3+
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
4+
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
; CHECK-SPIRV: Capability JointMatrixINTEL
9+
; CHECK-SPIRV: Extension "SPV_INTEL_joint_matrix"
10+
; CHECK-SPIRV: TypeInt [[#TypeInt:]] 64
11+
; CHECK-SPIRV: TypeFloat [[#TypeFloat:]] 32
12+
; CHECK-SPIRV: TypeJointMatrixINTEL [[#TypeMatrix:]] [[#TypeFloat]] [[#]] [[#]] [[#]] [[#]]
13+
; CHECK-SPIRV: Phi [[#TypeMatrix]] [[#Matrix:]]
14+
; CHECK-SPIRV: JointMatrixWorkItemLengthINTEL [[#TypeInt]] [[#]] [[#Matrix]]
15+
; CHECK-SPIRV: VectorExtractDynamic [[#TypeFloat]] [[#]] [[#Matrix]] [[#Index:]]
16+
; CHECK-SPIRV: FMul [[#TypeFloat]] [[#NewVal:]] [[#]] [[#]]
17+
; CHECK-SPIRV: VectorInsertDynamic [[#TypeMatrix]] [[#]] [[#Matrix]] [[#NewVal]] [[#Index]]
18+
19+
; CHECK-LLVM: [[Length:%.*]] = call spir_func i64 @_Z38__spirv_JointMatrixWorkItemLengthINTELPU3AS141__spirv_JointMatrixINTEL__float_16_16_0_3(%spirv.JointMatrixINTEL._float_16_16_0_3 addrspace(1)* [[Matrix:%.*]])
20+
; CHECK-LLVM: [[Elem:%.*]] = call spir_func float @_Z28__spirv_VectorExtractDynamicPU3AS141__spirv_JointMatrixINTEL__float_16_16_0_3l(%spirv.JointMatrixINTEL._float_16_16_0_3 addrspace(1)* [[Matrix]], i64 [[Index:%.*]])
21+
; CHECK-LLVM: [[NewVal:%.*]] = fmul float [[Elem]], 5.000000e+00
22+
; CHECK-LLVM: {{%.*}} = call spir_func %spirv.JointMatrixINTEL._float_16_16_0_3 addrspace(1)* @_Z27__spirv_VectorInsertDynamicPU3AS141__spirv_JointMatrixINTEL__float_16_16_0_3fl(%spirv.JointMatrixINTEL._float_16_16_0_3 addrspace(1)* [[Matrix]], float [[NewVal]], i64 [[Index]])
23+
24+
source_filename = "/work/tmp/matrix-slice.cpp"
25+
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"
26+
target triple = "spir64-unknown-unknown"
27+
28+
%"struct.cl::sycl::detail::AssertHappened" = type { i32, [257 x i8], [257 x i8], [129 x i8], i32, i64, i64, i64, i64, i64, i64 }
29+
%"class.cl::sycl::range" = type { %"class.cl::sycl::detail::array" }
30+
%"class.cl::sycl::detail::array" = type { [1 x i64] }
31+
%"class.cl::sycl::id" = type { %"class.cl::sycl::detail::array" }
32+
%"struct.__spv::__spirv_JointMatrixINTEL" = type { [16 x [16 x [1 x [4 x float]]]] addrspace(4)* }
33+
34+
$_ZTSN2cl4sycl6detail23__sycl_service_kernel__16AssertInfoCopierE = comdat any
35+
36+
$_ZTSZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_E6matrix = comdat any
37+
38+
; Function Attrs: convergent norecurse
39+
define weak_odr dso_local spir_kernel void @_ZTSN2cl4sycl6detail23__sycl_service_kernel__16AssertInfoCopierE(%"struct.cl::sycl::detail::AssertHappened" addrspace(1)* %_arg_, %"class.cl::sycl::range"* byval(%"class.cl::sycl::range") align 8 %_arg_1, %"class.cl::sycl::range"* byval(%"class.cl::sycl::range") align 8 %_arg_2, %"class.cl::sycl::id"* byval(%"class.cl::sycl::id") align 8 %_arg_3) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !5 {
40+
entry:
41+
%0 = getelementptr inbounds %"class.cl::sycl::id", %"class.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
42+
%1 = addrspacecast i64* %0 to i64 addrspace(4)*
43+
%2 = load i64, i64 addrspace(4)* %1, align 8
44+
%add.ptr.i = getelementptr inbounds %"struct.cl::sycl::detail::AssertHappened", %"struct.cl::sycl::detail::AssertHappened" addrspace(1)* %_arg_, i64 %2
45+
%3 = bitcast %"struct.cl::sycl::detail::AssertHappened" addrspace(1)* %add.ptr.i to i8 addrspace(1)*
46+
%4 = addrspacecast i8 addrspace(1)* %3 to i8 addrspace(4)*
47+
tail call spir_func void @__devicelib_assert_read(i8 addrspace(4)* %4) #2
48+
ret void
49+
}
50+
51+
; Function Attrs: convergent
52+
declare extern_weak dso_local spir_func void @__devicelib_assert_read(i8 addrspace(4)*) local_unnamed_addr #1
53+
54+
; Function Attrs: convergent norecurse
55+
define weak_odr dso_local spir_kernel void @_ZTSZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_E6matrix() local_unnamed_addr #0 comdat !kernel_arg_buffer_location !6 {
56+
entry:
57+
%call9.i.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(float addrspace(4)* addrspacecast (float addrspace(1)* null to float addrspace(4)*), i64 1, i32 0, i32 3, i32 0) #2
58+
br label %for.cond.i
59+
60+
for.cond.i: ; preds = %for.body.i, %entry
61+
%A.sroa.0.0.i = phi %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* [ %call9.i.i, %entry ], [ %call5.i.i, %for.body.i ]
62+
%i.0.i = phi i32 [ 0, %entry ], [ %inc.i, %for.body.i ]
63+
%conv.i = zext i32 %i.0.i to i64
64+
%call.i12.i = tail call spir_func i64 @_Z38__spirv_JointMatrixWorkItemLengthINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEmPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEE(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %A.sroa.0.0.i) #2
65+
%cmp.i = icmp ugt i64 %call.i12.i, %conv.i
66+
br i1 %cmp.i, label %for.body.i, label %_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlNS0_7nd_itemILi2EEEE_clES5_.exit
67+
68+
for.body.i: ; preds = %for.cond.i
69+
%call.i.i = tail call spir_func float @_Z28__spirv_VectorExtractDynamicIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EmET_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEET4_(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %A.sroa.0.0.i, i64 %conv.i) #2
70+
%mul.i.i = fmul float %call.i.i, 5.000000e+00
71+
%call5.i.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z27__spirv_VectorInsertDynamicIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EmEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEES7_T4_S5_(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %A.sroa.0.0.i, float %mul.i.i, i64 %conv.i) #2
72+
%inc.i = add nuw nsw i32 %i.0.i, 1
73+
br label %for.cond.i, !llvm.loop !7
74+
75+
_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlNS0_7nd_itemILi2EEEE_clES5_.exit: ; preds = %for.cond.i
76+
tail call spir_func void @_Z29__spirv_JointMatrixStoreINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(float addrspace(4)* addrspacecast (float addrspace(1)* null to float addrspace(4)*), %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %A.sroa.0.0.i, i64 1, i32 0, i32 3, i32 0) #2
77+
ret void
78+
}
79+
80+
; Function Attrs: convergent
81+
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(float addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
82+
83+
; Function Attrs: convergent
84+
declare dso_local spir_func i64 @_Z38__spirv_JointMatrixWorkItemLengthINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEmPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEE(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*) local_unnamed_addr #1
85+
86+
; Function Attrs: convergent
87+
declare dso_local spir_func float @_Z28__spirv_VectorExtractDynamicIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EmET_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEET4_(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*, i64) local_unnamed_addr #1
88+
89+
; Function Attrs: convergent
90+
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z27__spirv_VectorInsertDynamicIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EmEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEES7_T4_S5_(%"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*, float, i64) local_unnamed_addr #1
91+
92+
; Function Attrs: convergent
93+
declare dso_local spir_func void @_Z29__spirv_JointMatrixStoreINTELIfLm16ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(float addrspace(4)*, %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
94+
95+
attributes #0 = { convergent norecurse "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "sycl-module-id"="/work/tmp/matrix-slice.cpp" "uniform-work-group-size"="true" }
96+
attributes #1 = { convergent "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
97+
attributes #2 = { convergent }
98+
99+
!llvm.module.flags = !{!0, !1}
100+
!opencl.spir.version = !{!2}
101+
!spirv.Source = !{!3}
102+
!llvm.ident = !{!4}
103+
104+
!0 = !{i32 1, !"wchar_size", i32 4}
105+
!1 = !{i32 7, !"frame-pointer", i32 2}
106+
!2 = !{i32 1, i32 2}
107+
!3 = !{i32 4, i32 100000}
108+
!4 = !{!"clang version 14.0.0 (https://github.com/intel/llvm.git 3648adf79e4fdb619fdbe41d63bc39f456b5be8c)"}
109+
!5 = !{i32 -1, i32 -1, i32 -1, i32 -1}
110+
!6 = !{}
111+
!7 = distinct !{!7, !8}
112+
!8 = !{!"llvm.loop.mustprogress"}

0 commit comments

Comments
 (0)