Skip to content

Commit 3d89fc6

Browse files
vmaksimosys-ce-bb
authored andcommitted
Support SPV_INTEL_maximum_registers extension (#2344)
Spec: KhronosGroup/SPIRV-Registry#235 Original commit: KhronosGroup/SPIRV-LLVM-Translator@92ea64b77207d28
1 parent 6fb3494 commit 3d89fc6

File tree

13 files changed

+226
-4
lines changed

13 files changed

+226
-4
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,4 @@ EXT(SPV_INTEL_fp_max_error)
7171
EXT(SPV_INTEL_cache_controls)
7272
EXT(SPV_INTEL_subgroup_requirements)
7373
EXT(SPV_INTEL_task_sequence)
74+
EXT(SPV_INTEL_maximum_registers)

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4234,6 +4234,50 @@ bool SPIRVToLLVM::transMetadata() {
42344234
F->setMetadata(kSPIR2MD::IntelFPGAIPInterface,
42354235
MDNode::get(*Context, InterfaceMDVec));
42364236
}
4237+
if (auto *EM = BF->getExecutionMode(
4238+
internal::ExecutionModeMaximumRegistersINTEL)) {
4239+
NamedMDNode *ExecModeMD =
4240+
M->getOrInsertNamedMetadata(kSPIRVMD::ExecutionMode);
4241+
4242+
SmallVector<Metadata *, 4> ValueVec;
4243+
ValueVec.push_back(ConstantAsMetadata::get(F));
4244+
ValueVec.push_back(
4245+
ConstantAsMetadata::get(getUInt32(M, EM->getExecutionMode())));
4246+
ValueVec.push_back(
4247+
ConstantAsMetadata::get(getUInt32(M, EM->getLiterals()[0])));
4248+
ExecModeMD->addOperand(MDNode::get(*Context, ValueVec));
4249+
}
4250+
if (auto *EM = BF->getExecutionMode(
4251+
internal::ExecutionModeMaximumRegistersIdINTEL)) {
4252+
NamedMDNode *ExecModeMD =
4253+
M->getOrInsertNamedMetadata(kSPIRVMD::ExecutionMode);
4254+
4255+
SmallVector<Metadata *, 4> ValueVec;
4256+
ValueVec.push_back(ConstantAsMetadata::get(F));
4257+
ValueVec.push_back(
4258+
ConstantAsMetadata::get(getUInt32(M, EM->getExecutionMode())));
4259+
4260+
auto *ExecOp = BF->getModule()->getValue(EM->getLiterals()[0]);
4261+
ValueVec.push_back(
4262+
MDNode::get(*Context, ConstantAsMetadata::get(cast<ConstantInt>(
4263+
transValue(ExecOp, nullptr, nullptr)))));
4264+
ExecModeMD->addOperand(MDNode::get(*Context, ValueVec));
4265+
}
4266+
if (auto *EM = BF->getExecutionMode(
4267+
internal::ExecutionModeNamedMaximumRegistersINTEL)) {
4268+
NamedMDNode *ExecModeMD =
4269+
M->getOrInsertNamedMetadata(kSPIRVMD::ExecutionMode);
4270+
4271+
SmallVector<Metadata *, 4> ValueVec;
4272+
ValueVec.push_back(ConstantAsMetadata::get(F));
4273+
ValueVec.push_back(
4274+
ConstantAsMetadata::get(getUInt32(M, EM->getExecutionMode())));
4275+
4276+
assert(EM->getLiterals()[0] == 0 &&
4277+
"Invalid named maximum number of registers");
4278+
ValueVec.push_back(MDString::get(*Context, "AutoINTEL"));
4279+
ExecModeMD->addOperand(MDNode::get(*Context, ValueVec));
4280+
}
42374281
}
42384282
NamedMDNode *MemoryModelMD =
42394283
M->getOrInsertNamedMetadata(kSPIRVMD::MemoryModel);

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,10 @@ SPIRVFunction *LLVMToSPIRVBase::transFunctionDecl(Function *F) {
981981

982982
transFPGAFunctionMetadata(BF, F);
983983

984-
transFunctionMetadataAsUserSemanticDecoration(BF, F);
984+
if (BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_maximum_registers))
985+
transFunctionMetadataAsExecutionMode(BF, F);
986+
else
987+
transFunctionMetadataAsUserSemanticDecoration(BF, F);
985988

986989
transAuxDataInst(BF, F);
987990

@@ -1136,6 +1139,38 @@ void LLVMToSPIRVBase::transFPGAFunctionMetadata(SPIRVFunction *BF,
11361139
transMetadataDecorations(FDecoMD, BF);
11371140
}
11381141

1142+
void LLVMToSPIRVBase::transFunctionMetadataAsExecutionMode(SPIRVFunction *BF,
1143+
Function *F) {
1144+
SmallVector<MDNode *, 1> RegisterAllocModeMDs;
1145+
F->getMetadata("RegisterAllocMode", RegisterAllocModeMDs);
1146+
1147+
for (unsigned I = 0; I < RegisterAllocModeMDs.size(); I++) {
1148+
auto *RegisterAllocMode = RegisterAllocModeMDs[I]->getOperand(0).get();
1149+
if (isa<MDString>(RegisterAllocMode)) {
1150+
StringRef Str = getMDOperandAsString(RegisterAllocModeMDs[I], 0);
1151+
internal::InternalNamedMaximumNumberOfRegisters NamedValue =
1152+
SPIRVNamedMaximumNumberOfRegistersNameMap::rmap(Str.str());
1153+
BF->addExecutionMode(BM->add(new SPIRVExecutionMode(
1154+
OpExecutionMode, BF,
1155+
internal::ExecutionModeNamedMaximumRegistersINTEL, NamedValue)));
1156+
} else if (isa<MDNode>(RegisterAllocMode)) {
1157+
auto *RegisterAllocNodeMDOp =
1158+
getMDOperandAsMDNode(RegisterAllocModeMDs[I], 0);
1159+
int Num = getMDOperandAsInt(RegisterAllocNodeMDOp, 0);
1160+
auto *Const =
1161+
BM->addConstant(transType(Type::getInt32Ty(F->getContext())), Num);
1162+
BF->addExecutionMode(BM->add(new SPIRVExecutionModeId(
1163+
BF, internal::ExecutionModeMaximumRegistersIdINTEL, Const->getId())));
1164+
} else {
1165+
int64_t RegisterAllocVal =
1166+
mdconst::dyn_extract<ConstantInt>(RegisterAllocMode)->getZExtValue();
1167+
BF->addExecutionMode(BM->add(new SPIRVExecutionMode(
1168+
OpExecutionMode, BF, internal::ExecutionModeMaximumRegistersINTEL,
1169+
RegisterAllocVal)));
1170+
}
1171+
}
1172+
}
1173+
11391174
void LLVMToSPIRVBase::transFunctionMetadataAsUserSemanticDecoration(
11401175
SPIRVFunction *BF, Function *F) {
11411176
if (auto *RegisterAllocModeMD = F->getMetadata("RegisterAllocMode")) {

llvm-spirv/lib/SPIRV/SPIRVWriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class LLVMToSPIRVBase : protected BuiltinCallHelper {
131131
SPIRVFunction *transFunctionDecl(Function *F);
132132
void transVectorComputeMetadata(Function *F);
133133
void transFPGAFunctionMetadata(SPIRVFunction *BF, Function *F);
134+
void transFunctionMetadataAsExecutionMode(SPIRVFunction *BF, Function *F);
134135
void transFunctionMetadataAsUserSemanticDecoration(SPIRVFunction *BF,
135136
Function *F);
136137
void transAuxDataInst(SPIRVFunction *BF, Function *F);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,9 @@ void SPIRVExecutionMode::decode(std::istream &I) {
661661
case ExecutionModeRegisterMapInterfaceINTEL:
662662
case ExecutionModeStreamingInterfaceINTEL:
663663
case spv::internal::ExecutionModeNamedSubgroupSizeINTEL:
664+
case internal::ExecutionModeMaximumRegistersINTEL:
665+
case internal::ExecutionModeMaximumRegistersIdINTEL:
666+
case internal::ExecutionModeNamedMaximumRegistersINTEL:
664667
WordLiterals.resize(1);
665668
break;
666669
default:

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,17 @@ class SPIRVExecutionMode : public SPIRVAnnotation {
696696
}
697697
}
698698

699+
std::optional<ExtensionID> getRequiredExtension() const override {
700+
switch (static_cast<unsigned>(ExecMode)) {
701+
case internal::ExecutionModeMaximumRegistersINTEL:
702+
case internal::ExecutionModeMaximumRegistersIdINTEL:
703+
case internal::ExecutionModeNamedMaximumRegistersINTEL:
704+
return ExtensionID::SPV_INTEL_maximum_registers;
705+
default:
706+
return {};
707+
}
708+
}
709+
699710
protected:
700711
_SPIRV_DCL_ENCDEC
701712
SPIRVExecutionModeKind ExecMode;
@@ -757,6 +768,11 @@ class SPIRVComponentExecutionModes {
757768
return IsDenorm(EMK) || IsRoundingMode(EMK) || IsFPMode(EMK) ||
758769
IsOtherFP(EMK);
759770
};
771+
auto IsMaxRegisters = [&](auto EMK) {
772+
return EMK == internal::ExecutionModeMaximumRegistersINTEL ||
773+
EMK == internal::ExecutionModeMaximumRegistersIdINTEL ||
774+
EMK == internal::ExecutionModeNamedMaximumRegistersINTEL;
775+
};
760776
auto IsCompatible = [&](SPIRVExecutionMode *EM0, SPIRVExecutionMode *EM1) {
761777
if (EM0->getTargetId() != EM1->getTargetId())
762778
return true;
@@ -770,7 +786,8 @@ class SPIRVComponentExecutionModes {
770786
return true;
771787
return !(IsDenorm(EMK0) && IsDenorm(EMK1)) &&
772788
!(IsRoundingMode(EMK0) && IsRoundingMode(EMK1)) &&
773-
!(IsFPMode(EMK0) && IsFPMode(EMK1));
789+
!(IsFPMode(EMK0) && IsFPMode(EMK1)) &&
790+
!(IsMaxRegisters(EMK0) && IsMaxRegisters(EMK1));
774791
};
775792
for (auto I = ExecModes.begin(); I != ExecModes.end(); ++I) {
776793
assert(IsCompatible(ExecMode, (*I).second) &&

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,12 @@ template <> inline void SPIRVMap<SPIRVExecutionModeKind, SPIRVCapVec>::init() {
293293
{CapabilityVectorComputeINTEL});
294294
ADD_VEC_INIT(internal::ExecutionModeNamedSubgroupSizeINTEL,
295295
{internal::CapabilitySubgroupRequirementsINTEL});
296+
ADD_VEC_INIT(internal::ExecutionModeMaximumRegistersINTEL,
297+
{internal::CapabilityRegisterLimitsINTEL});
298+
ADD_VEC_INIT(internal::ExecutionModeMaximumRegistersIdINTEL,
299+
{internal::CapabilityRegisterLimitsINTEL});
300+
ADD_VEC_INIT(internal::ExecutionModeNamedMaximumRegistersINTEL,
301+
{internal::CapabilityRegisterLimitsINTEL});
296302
}
297303

298304
template <> inline void SPIRVMap<SPIRVMemoryModelKind, SPIRVCapVec>::init() {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ inline bool isValid(spv::ExecutionModel V) {
7373
case ExecutionModelCallableKHR:
7474
case ExecutionModeRegisterMapInterfaceINTEL:
7575
case ExecutionModeStreamingInterfaceINTEL:
76+
case internal::ExecutionModeMaximumRegistersINTEL:
77+
case internal::ExecutionModeMaximumRegistersIdINTEL:
78+
case internal::ExecutionModeNamedMaximumRegistersINTEL:
7679
return true;
7780
default:
7881
return false;

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,7 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
688688
add(internal::CapabilitySubgroupRequirementsINTEL,
689689
"SubgroupRequirementsINTEL");
690690
add(internal::CapabilityTaskSequenceINTEL, "TaskSequenceINTEL");
691+
add(internal::CapabilityRegisterLimitsINTEL, "RegisterLimitsINTEL");
691692
}
692693
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
693694

@@ -711,6 +712,14 @@ template <> inline void SPIRVMap<HostAccessQualifier, std::string>::init() {
711712
}
712713
SPIRV_DEF_NAMEMAP(HostAccessQualifier, SPIRVHostAccessQualifierNameMap)
713714

715+
template <>
716+
inline void
717+
SPIRVMap<internal::InternalNamedMaximumNumberOfRegisters, std::string>::init() {
718+
add(internal::NamedMaximumNumberOfRegistersAutoINTEL, "AutoINTEL");
719+
}
720+
SPIRV_DEF_NAMEMAP(internal::InternalNamedMaximumNumberOfRegisters,
721+
SPIRVNamedMaximumNumberOfRegistersNameMap);
722+
714723
} /* namespace SPIRV */
715724

716725
#endif // SPIRV_LIBSPIRV_SPIRVNAMEMAPENUM_H

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ SPIRV_DEF_ENCDEC(SPIRVDebugExtOpKind)
147147
SPIRV_DEF_ENCDEC(NonSemanticAuxDataOpKind)
148148
SPIRV_DEF_ENCDEC(InitializationModeQualifier)
149149
SPIRV_DEF_ENCDEC(HostAccessQualifier)
150+
SPIRV_DEF_ENCDEC(internal::InternalNamedMaximumNumberOfRegisters)
150151
SPIRV_DEF_ENCDEC(LinkageType)
151152

152153
// Read a string with padded 0's at the end so that they form a stream of

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ SPIRV_DEC_ENCDEC(SPIRVDebugExtOpKind)
231231
SPIRV_DEC_ENCDEC(NonSemanticAuxDataOpKind)
232232
SPIRV_DEC_ENCDEC(InitializationModeQualifier)
233233
SPIRV_DEC_ENCDEC(HostAccessQualifier)
234+
SPIRV_DEC_ENCDEC(internal::InternalNamedMaximumNumberOfRegisters)
234235
SPIRV_DEC_ENCDEC(LinkageType)
235236

236237
const SPIRVEncoder &operator<<(const SPIRVEncoder &O, const std::string &Str);

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,18 @@ enum InternalCapability {
124124
ICapabilityJointMatrixPackedInt2ComponentTypeINTEL = 6438,
125125
ICapabilityJointMatrixPackedInt4ComponentTypeINTEL = 6439,
126126
ICapabilityCacheControlsINTEL = 6441,
127-
ICapabilitySubgroupRequirementsINTEL = 6445
127+
ICapabilitySubgroupRequirementsINTEL = 6445,
128+
ICapRegisterLimitsINTEL = 6460
128129
};
129130

130131
enum InternalFunctionControlMask { IFunctionControlOptNoneINTELMask = 0x10000 };
131132

132133
enum InternalExecutionMode {
133134
IExecModeFastCompositeKernelINTEL = 6088,
134-
IExecModeNamedSubgroupSizeINTEL = 6446
135+
IExecModeNamedSubgroupSizeINTEL = 6446,
136+
IExecModeMaximumRegistersINTEL = 6461,
137+
IExecModeMaximumRegistersIdINTEL = 6462,
138+
IExecModeNamedMaximumRegistersINTEL = 6463
135139
};
136140

137141
constexpr LinkageType LinkageTypeInternal =
@@ -159,6 +163,10 @@ enum InternalBuiltIn {
159163
IBuiltInGlobalHWThreadIDINTEL = 6136,
160164
};
161165

166+
enum InternalNamedMaximumNumberOfRegisters {
167+
NamedMaximumNumberOfRegistersAutoINTEL = 0,
168+
};
169+
162170
#define _SPIRV_OP(x, y) constexpr x x##y = static_cast<x>(I##x##y);
163171
_SPIRV_OP(Capability, JointMatrixINTEL)
164172
_SPIRV_OP(Capability, JointMatrixWIInstructionsINTEL)
@@ -292,12 +300,20 @@ constexpr Capability CapabilityBfloat16ConversionINTEL =
292300
static_cast<Capability>(ICapBfloat16ConversionINTEL);
293301
constexpr Capability CapabilityGlobalVariableDecorationsINTEL =
294302
static_cast<Capability>(ICapGlobalVariableDecorationsINTEL);
303+
constexpr Capability CapabilityRegisterLimitsINTEL =
304+
static_cast<Capability>(ICapRegisterLimitsINTEL);
295305

296306
constexpr FunctionControlMask FunctionControlOptNoneINTELMask =
297307
static_cast<FunctionControlMask>(IFunctionControlOptNoneINTELMask);
298308

299309
constexpr ExecutionMode ExecutionModeFastCompositeKernelINTEL =
300310
static_cast<ExecutionMode>(IExecModeFastCompositeKernelINTEL);
311+
constexpr ExecutionMode ExecutionModeMaximumRegistersINTEL =
312+
static_cast<ExecutionMode>(IExecModeMaximumRegistersINTEL);
313+
constexpr ExecutionMode ExecutionModeMaximumRegistersIdINTEL =
314+
static_cast<ExecutionMode>(IExecModeMaximumRegistersIdINTEL);
315+
constexpr ExecutionMode ExecutionModeNamedMaximumRegistersINTEL =
316+
static_cast<ExecutionMode>(IExecModeNamedMaximumRegistersINTEL);
301317

302318
constexpr ExecutionMode ExecutionModeNamedSubgroupSizeINTEL =
303319
static_cast<ExecutionMode>(IExecModeNamedSubgroupSizeINTEL);
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv -spirv-text --spirv-ext=+SPV_INTEL_maximum_registers %t.bc
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_maximum_registers -o %t.spv
5+
; RUN: llvm-spirv -r %t.spv -spirv-target-env=SPV-IR -o - | llvm-dis -o %t.rev.ll
6+
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
7+
8+
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC0:]] "main_l3"
9+
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC1:]] "main_l6"
10+
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC2:]] "main_l9"
11+
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC3:]] "main_l13"
12+
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC4:]] "main_l19"
13+
14+
; CHECK-SPIRV: ExecutionMode [[#FUNC0]] 6461 2
15+
; CHECK-SPIRV: ExecutionMode [[#FUNC1]] 6461 1
16+
; CHECK-SPIRV: ExecutionMode [[#FUNC2]] 6463 0
17+
; CHECK-SPIRV: ExecutionModeId [[#FUNC3]] 6462 [[#Const3:]]
18+
; CHECK-SPIRV: TypeInt [[#TypeInt:]] 32 0
19+
; CHECK-SPIRV: Constant [[#TypeInt]] [[#Const3]] 3
20+
21+
; CHECK-SPIRV-NOT: ExecutionMode [[#FUNC4]]
22+
23+
; CHECK-LLVM: !spirv.ExecutionMode = !{![[#FLAG0:]], ![[#FLAG1:]], ![[#FLAG2:]], ![[#FLAG3:]]}
24+
; CHECK-LLVM: ![[#FLAG0]] = !{ptr @main_l3, i32 6461, i32 2}
25+
; CHECK-LLVM: ![[#FLAG1]] = !{ptr @main_l6, i32 6461, i32 1}
26+
; CHECK-LLVM: ![[#FLAG2]] = !{ptr @main_l9, i32 6463, !"AutoINTEL"}
27+
; CHECK-LLVM: ![[#FLAG3]] = !{ptr @main_l13, i32 6462, ![[#VAL:]]}
28+
; CHECK-LLVM: ![[#VAL]] = !{i32 3}
29+
30+
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"
31+
target triple = "spir64"
32+
33+
; Function Attrs: noinline nounwind optnone
34+
define weak dso_local spir_kernel void @main_l3() #0 !RegisterAllocMode !10 {
35+
newFuncRoot:
36+
ret void
37+
}
38+
39+
; Function Attrs: noinline nounwind optnone
40+
define weak dso_local spir_kernel void @main_l6() #0 !RegisterAllocMode !11 {
41+
newFuncRoot:
42+
ret void
43+
}
44+
45+
; Function Attrs: noinline nounwind optnone
46+
define weak dso_local spir_kernel void @main_l9() #0 !RegisterAllocMode !12 {
47+
newFuncRoot:
48+
ret void
49+
}
50+
51+
; Function Attrs: noinline nounwind optnone
52+
define weak dso_local spir_kernel void @main_l13() #0 !RegisterAllocMode !13 {
53+
newFuncRoot:
54+
ret void
55+
}
56+
57+
; Function Attrs: noinline nounwind optnone
58+
define weak dso_local spir_kernel void @main_l19() #0 {
59+
newFuncRoot:
60+
ret void
61+
}
62+
63+
attributes #0 = { noinline nounwind optnone }
64+
65+
66+
!opencl.compiler.options = !{!0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0}
67+
!spirv.Source = !{!2, !3, !3, !3, !3, !3, !2, !3, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2}
68+
!llvm.module.flags = !{!4, !5, !6, !7, !8}
69+
!spirv.MemoryModel = !{!9, !9, !9, !9, !9, !9}
70+
!spirv.ExecutionMode = !{}
71+
72+
!0 = !{}
73+
!2 = !{i32 4, i32 200000}
74+
!3 = !{i32 3, i32 200000}
75+
!4 = !{i32 1, !"wchar_size", i32 4}
76+
!5 = !{i32 7, !"openmp", i32 50}
77+
!6 = !{i32 7, !"openmp-device", i32 50}
78+
!7 = !{i32 8, !"PIC Level", i32 2}
79+
!8 = !{i32 7, !"frame-pointer", i32 2}
80+
!9 = !{i32 2, i32 2}
81+
!10 = !{i32 2}
82+
!11 = !{i32 1}
83+
!12 = !{!"AutoINTEL"}
84+
!13 = !{!14}
85+
!14 = !{i32 3}

0 commit comments

Comments
 (0)