Skip to content

Commit 96296a4

Browse files
aratajewjsji
authored andcommitted
Support for SPV_INTEL_cache_controls (#2140)
Specification: KhronosGroup/SPIRV-Registry#216 Original commit: KhronosGroup/SPIRV-LLVM-Translator@387841b
1 parent 4fcf03d commit 96296a4

File tree

12 files changed

+266
-13
lines changed

12 files changed

+266
-13
lines changed

llvm-spirv/docs/SPIRVRepresentationInLLVM.rst

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,14 +411,14 @@ For example:
411411
are translated for image types, but they should be encoded in LLVM IR type name
412412
rather than function metadata.
413413

414-
Function parameter and global variable decoration through metadata
414+
Function parameter, instruction and global variable decoration through metadata
415415
------------------------------------------------------------------
416416

417-
Both function parameters and global variables can be decorated using LLVM
417+
Function parameters, instructions and global variables can be decorated using LLVM
418418
metadata through the metadata names ``spirv.ParameterDecorations`` and
419419
``spirv.Decorations`` respectively. ``spirv.ParameterDecorations`` must be tied
420420
to the kernel function while ``spirv.Decorations`` is tied directly to the
421-
global variable.
421+
instruction or global variable.
422422

423423
A "decoration-node" is a metadata node consisting of one or more operands. The
424424
first operand is an integer literal representing the SPIR-V decoration
@@ -434,7 +434,7 @@ decoration-nodes.
434434
references to decoration-lists, where N is the number of arguments of the
435435
function the metadata is tied to.
436436

437-
``spirv.Decorations`` example:
437+
``spirv.Decorations`` applied on a global variable example:
438438

439439
.. code-block:: llvm
440440
@@ -447,6 +447,18 @@ function the metadata is tied to.
447447
decorates a global variable ``v`` with ``Constant`` and ``LinkageAttributes``
448448
with extra operands ``"v"`` and ``Export`` in SPIR-V.
449449

450+
``spirv.Decorations`` applied on an instruction example:
451+
452+
.. code-block:: llvm
453+
454+
%idx = getelementptr inbounds i32, ptr addrspace(1) %b, i64 1, !spirv.Decorations !1
455+
...
456+
!1 = !{!2}
457+
!2 = !{i32 6442, i32 1, i32 2} ; {CacheControlLoadINTEL, CacheLevel=1, Cached}
458+
459+
decorates getelementptr instruction with CacheControlLoadINTEL decoration with
460+
extra operands ``i32 1`` and ``i32 2``.
461+
450462
``spirv.ParameterDecorations`` example:
451463

452464
.. code-block:: llvm

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,4 @@ EXT(SPV_INTEL_tensor_float32_rounding)
6363
EXT(SPV_EXT_relaxed_printf_string_address_space)
6464
EXT(SPV_INTEL_fpga_argument_interfaces)
6565
EXT(SPV_INTEL_fpga_latency_control)
66+
EXT(SPV_INTEL_cache_controls)

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3850,17 +3850,22 @@ transDecorationsToMetadataList(llvm::LLVMContext *Context,
38503850
return MDNode::get(*Context, MDs);
38513851
}
38523852

3853-
void SPIRVToLLVM::transVarDecorationsToMetadata(SPIRVValue *BV, Value *V) {
3854-
if (!BV->isVariable())
3853+
void SPIRVToLLVM::transDecorationsToMetadata(SPIRVValue *BV, Value *V) {
3854+
if (!BV->isVariable() && !BV->isInst())
38553855
return;
38563856

3857-
if (auto *GV = dyn_cast<GlobalVariable>(V)) {
3857+
auto SetDecorationsMetadata = [&](auto V) {
38583858
std::vector<SPIRVDecorate const *> Decorates = BV->getDecorations();
38593859
if (!Decorates.empty()) {
38603860
MDNode *MDList = transDecorationsToMetadataList(Context, Decorates);
3861-
GV->setMetadata(SPIRV_MD_DECORATIONS, MDList);
3861+
V->setMetadata(SPIRV_MD_DECORATIONS, MDList);
38623862
}
3863-
}
3863+
};
3864+
3865+
if (auto *GV = dyn_cast<GlobalVariable>(V))
3866+
SetDecorationsMetadata(GV);
3867+
else if (auto *I = dyn_cast<Instruction>(V))
3868+
SetDecorationsMetadata(I);
38643869
}
38653870

38663871
bool SPIRVToLLVM::transDecoration(SPIRVValue *BV, Value *V) {
@@ -3872,7 +3877,7 @@ bool SPIRVToLLVM::transDecoration(SPIRVValue *BV, Value *V) {
38723877

38733878
// Decoration metadata is only enabled in SPIR-V friendly mode
38743879
if (BM->getDesiredBIsRepresentation() == BIsRepresentation::SPIRVFriendlyIR)
3875-
transVarDecorationsToMetadata(BV, V);
3880+
transDecorationsToMetadata(BV, V);
38763881

38773882
DbgTran->transDbgInfo(BV, V);
38783883
return true;

llvm-spirv/lib/SPIRV/SPIRVReader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ class SPIRVToLLVM : private BuiltinCallHelper {
255255
SmallVectorImpl<Function *> &Funcs);
256256
void transIntelFPGADecorations(SPIRVValue *BV, Value *V);
257257
void transMemAliasingINTELDecorations(SPIRVValue *BV, Value *V);
258-
void transVarDecorationsToMetadata(SPIRVValue *BV, Value *V);
258+
void transDecorationsToMetadata(SPIRVValue *BV, Value *V);
259259
void transFunctionDecorationsToMetadata(SPIRVFunction *BF, Function *F);
260260
void
261261
transFunctionPointerCallArgumentAttributes(SPIRVValue *BV, CallInst *CI,

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2675,6 +2675,48 @@ static void transMetadataDecorations(Metadata *MD, SPIRVEntry *Target) {
26752675
new SPIRVDecorateImplementInCSRINTEL(Target, Value->getZExtValue()));
26762676
break;
26772677
}
2678+
case spv::internal::DecorationCacheControlLoadINTEL: {
2679+
ErrLog.checkError(
2680+
NumOperands == 3, SPIRVEC_InvalidLlvmModule,
2681+
"CacheControlLoadINTEL requires exactly 2 extra operands");
2682+
auto *CacheLevel =
2683+
mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2684+
auto *CacheControl =
2685+
mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(2));
2686+
ErrLog.checkError(CacheLevel, SPIRVEC_InvalidLlvmModule,
2687+
"CacheControlLoadINTEL cache level operand is required "
2688+
"to be an integer");
2689+
ErrLog.checkError(CacheControl, SPIRVEC_InvalidLlvmModule,
2690+
"CacheControlLoadINTEL cache control operand is "
2691+
"required to be an integer");
2692+
2693+
Target->addDecorate(new SPIRVDecorateCacheControlLoadINTEL(
2694+
Target, CacheLevel->getZExtValue(),
2695+
static_cast<internal::LoadCacheControlINTEL>(
2696+
CacheControl->getZExtValue())));
2697+
break;
2698+
}
2699+
case spv::internal::DecorationCacheControlStoreINTEL: {
2700+
ErrLog.checkError(
2701+
NumOperands == 3, SPIRVEC_InvalidLlvmModule,
2702+
"CacheControlStoreINTEL requires exactly 2 extra operands");
2703+
auto *CacheLevel =
2704+
mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(1));
2705+
auto *CacheControl =
2706+
mdconst::dyn_extract<ConstantInt>(DecoMD->getOperand(2));
2707+
ErrLog.checkError(CacheLevel, SPIRVEC_InvalidLlvmModule,
2708+
"CacheControlStoreINTEL cache level operand is "
2709+
"required to be an integer");
2710+
ErrLog.checkError(CacheControl, SPIRVEC_InvalidLlvmModule,
2711+
"CacheControlStoreINTEL cache control operand is "
2712+
"required to be an integer");
2713+
2714+
Target->addDecorate(new SPIRVDecorateCacheControlStoreINTEL(
2715+
Target, CacheLevel->getZExtValue(),
2716+
static_cast<internal::StoreCacheControlINTEL>(
2717+
CacheControl->getZExtValue())));
2718+
break;
2719+
}
26782720
default: {
26792721
if (NumOperands == 1) {
26802722
Target->addDecorate(new SPIRVDecorate(DecoKind, Target));
@@ -2762,9 +2804,12 @@ bool LLVMToSPIRVBase::transDecoration(Value *V, SPIRVValue *BV) {
27622804
BV->setFPFastMathMode(M);
27632805
}
27642806
}
2765-
if (Instruction *Inst = dyn_cast<Instruction>(V))
2807+
if (Instruction *Inst = dyn_cast<Instruction>(V)) {
27662808
if (shouldTryToAddMemAliasingDecoration(Inst))
27672809
transMemAliasingINTELDecorations(Inst, BV);
2810+
if (auto *IDecoMD = Inst->getMetadata(SPIRV_MD_DECORATIONS))
2811+
transMetadataDecorations(IDecoMD, BV);
2812+
}
27682813

27692814
if (auto *CI = dyn_cast<CallInst>(V)) {
27702815
auto OC = BV->getOpCode();

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ class SPIRVDecorate : public SPIRVDecorateGeneric {
201201
case DecorationLatencyControlLabelINTEL:
202202
case DecorationLatencyControlConstraintINTEL:
203203
return ExtensionID::SPV_INTEL_fpga_latency_control;
204+
case internal::DecorationCacheControlLoadINTEL:
205+
case internal::DecorationCacheControlStoreINTEL:
206+
return ExtensionID::SPV_INTEL_cache_controls;
204207
default:
205208
return {};
206209
}
@@ -794,6 +797,37 @@ class SPIRVDecorateImplementInCSRINTEL : public SPIRVDecorate {
794797
Value) {}
795798
};
796799

800+
class SPIRVDecorateCacheControlLoadINTEL : public SPIRVDecorate {
801+
public:
802+
// Complete constructor for SPIRVDecorateCacheControlLoadINTEL
803+
SPIRVDecorateCacheControlLoadINTEL(
804+
SPIRVEntry *TheTarget, SPIRVWord CacheLevel,
805+
spv::internal::LoadCacheControlINTEL CacheControl)
806+
: SPIRVDecorate(spv::internal::DecorationCacheControlLoadINTEL, TheTarget,
807+
CacheLevel, static_cast<SPIRVWord>(CacheControl)){};
808+
809+
SPIRVWord getCacheLevel() const { return Literals.at(0); };
810+
spv::internal::LoadCacheControlINTEL getCacheControl() const {
811+
return static_cast<spv::internal::LoadCacheControlINTEL>(Literals.at(1));
812+
};
813+
};
814+
815+
class SPIRVDecorateCacheControlStoreINTEL : public SPIRVDecorate {
816+
public:
817+
// Complete constructor for SPIRVDecorateCacheControlStoreINTEL
818+
SPIRVDecorateCacheControlStoreINTEL(
819+
SPIRVEntry *TheTarget, SPIRVWord CacheLevel,
820+
spv::internal::StoreCacheControlINTEL CacheControl)
821+
: SPIRVDecorate(spv::internal::DecorationCacheControlStoreINTEL,
822+
TheTarget, CacheLevel,
823+
static_cast<SPIRVWord>(CacheControl)){};
824+
825+
SPIRVWord getCacheLevel() const { return Literals.at(0); };
826+
spv::internal::StoreCacheControlINTEL getCacheControl() const {
827+
return static_cast<spv::internal::StoreCacheControlINTEL>(Literals.at(1));
828+
};
829+
};
830+
797831
} // namespace SPIRV
798832

799833
#endif // SPIRV_LIBSPIRV_SPIRVDECORATE_H

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,10 @@ template <> inline void SPIRVMap<Decoration, SPIRVCapVec>::init() {
475475
{internal::CapabilityGlobalVariableDecorationsINTEL});
476476
ADD_VEC_INIT(internal::DecorationArgumentAttributeINTEL,
477477
{CapabilityFunctionPointersINTEL});
478+
ADD_VEC_INIT(internal::DecorationCacheControlLoadINTEL,
479+
{internal::CapabilityCacheControlsINTEL});
480+
ADD_VEC_INIT(internal::DecorationCacheControlStoreINTEL,
481+
{internal::CapabilityCacheControlsINTEL});
478482
ADD_VEC_INIT(DecorationConduitKernelArgumentINTEL,
479483
{CapabilityFPGAArgumentInterfacesINTEL});
480484
ADD_VEC_INIT(DecorationRegisterMapKernelArgumentINTEL,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ template <> inline void SPIRVMap<Decoration, std::string>::init() {
221221
add(internal::DecorationInitModeINTEL, "InitModeINTEL");
222222
add(internal::DecorationImplementInCSRINTEL, "ImplementInCSRINTEL");
223223
add(internal::DecorationArgumentAttributeINTEL, "ArgumentAttributeINTEL");
224+
add(internal::DecorationCacheControlLoadINTEL, "CacheControlLoadINTEL");
225+
add(internal::DecorationCacheControlStoreINTEL, "CacheControlStoreINTEL");
224226

225227
add(DecorationMax, "Max");
226228
}
@@ -661,6 +663,7 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
661663
"JointMatrixPackedInt2ComponentTypeINTEL");
662664
add(internal::CapabilityJointMatrixPackedInt4ComponentTypeINTEL,
663665
"JointMatrixPackedInt4ComponentTypeINTEL");
666+
add(internal::CapabilityCacheControlsINTEL, "CacheControlsINTEL");
664667
}
665668
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
666669

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ enum InternalDecoration {
8888
IDecInitModeINTEL = 6148,
8989
IDecImplementInCSRINTEL = 6149,
9090
IDecArgumentAttributeINTEL = 6409,
91+
IDecCacheControlLoadINTEL = 6442,
92+
IDecCacheControlStoreINTEL = 6443,
9193
IDecFuncParamKindINTEL = 9624,
9294
IDecFuncParamDescINTEL = 9625
9395
};
@@ -108,7 +110,8 @@ enum InternalCapability {
108110
ICapabilityJointMatrixTF32ComponentTypeINTEL = 6436,
109111
ICapabilityJointMatrixBF16ComponentTypeINTEL = 6437,
110112
ICapabilityJointMatrixPackedInt2ComponentTypeINTEL = 6438,
111-
ICapabilityJointMatrixPackedInt4ComponentTypeINTEL = 6439
113+
ICapabilityJointMatrixPackedInt4ComponentTypeINTEL = 6439,
114+
ICapabilityCacheControlsINTEL = 6441
112115
};
113116

114117
enum InternalFunctionControlMask { IFunctionControlOptNoneINTELMask = 0x10000 };
@@ -142,6 +145,21 @@ enum InternalBuiltIn {
142145
IBuiltInGlobalHWThreadIDINTEL = 6136,
143146
};
144147

148+
enum class LoadCacheControlINTEL {
149+
Uncached = 0,
150+
Cached = 1,
151+
Streaming = 2,
152+
InvalidateAfterRead = 3,
153+
ConstCached = 4
154+
};
155+
156+
enum class StoreCacheControlINTEL {
157+
Uncached = 0,
158+
WriteThrough = 1,
159+
WriteBack = 2,
160+
Streaming = 3
161+
};
162+
145163
#define _SPIRV_OP(x, y) constexpr x x##y = static_cast<x>(I##x##y);
146164
_SPIRV_OP(Capability, JointMatrixINTEL)
147165
_SPIRV_OP(Capability, JointMatrixWIInstructionsINTEL)
@@ -174,6 +192,8 @@ _SPIRV_OP(Op, MaskedScatterINTEL)
174192

175193
_SPIRV_OP(Capability, TensorFloat32RoundingINTEL)
176194
_SPIRV_OP(Op, RoundFToTF32INTEL)
195+
196+
_SPIRV_OP(Capability, CacheControlsINTEL)
177197
#undef _SPIRV_OP
178198

179199
constexpr SourceLanguage SourceLanguagePython =
@@ -239,6 +259,10 @@ constexpr Decoration DecorationFuncParamKindINTEL =
239259
static_cast<Decoration>(IDecFuncParamKindINTEL);
240260
constexpr Decoration DecorationFuncParamDescINTEL =
241261
static_cast<Decoration>(IDecFuncParamDescINTEL);
262+
constexpr Decoration DecorationCacheControlLoadINTEL =
263+
static_cast<Decoration>(IDecCacheControlLoadINTEL);
264+
constexpr Decoration DecorationCacheControlStoreINTEL =
265+
static_cast<Decoration>(IDecCacheControlStoreINTEL);
242266

243267
constexpr Capability CapabilityFastCompositeINTEL =
244268
static_cast<Capability>(ICapFastCompositeINTEL);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_cache_controls -spirv-text %t.bc -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3+
; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_cache_controls %t.bc -o %t.spv
4+
; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM
5+
6+
; CHECK-SPIRV-DAG: Load {{[0-9]+}} {{[0-9]+}} [[LoadPtr:[0-9]+]]
7+
; CHECK-SPIRV-DAG: Store [[StorePtr:[0-9]+]]
8+
9+
; CHECK-SPIRV-DAG: Decorate [[LoadPtr]] CacheControlLoadINTEL 0 1
10+
; CHECK-SPIRV-DAG: Decorate [[LoadPtr]] CacheControlLoadINTEL 1 1
11+
; CHECK-SPIRV-DAG: Decorate [[StorePtr]] CacheControlStoreINTEL 0 1
12+
; CHECK-SPIRV-DAG: Decorate [[StorePtr]] CacheControlStoreINTEL 1 2
13+
14+
; CHECK-LLVM: %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %buffer, i64 1, !spirv.Decorations [[LoadMD:![0-9]+]]
15+
; CHECK-LLVM: load i32, ptr addrspace(1) %arrayidx, align 4
16+
17+
; CHECK-LLVM: %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %buffer, i64 0, !spirv.Decorations [[StoreMD:![0-9]+]]
18+
; CHECK-LLVM: store i32 %0, ptr addrspace(1) %arrayidx1, align 4
19+
20+
; CHECK-LLVM: [[LoadMD]] = !{[[CC0:![0-9]+]], [[CC1:![0-9]+]]}
21+
; CHECK-LLVM: [[CC0]] = !{i32 6442, i32 0, i32 1}
22+
; CHECK-LLVM: [[CC1]] = !{i32 6442, i32 1, i32 1}
23+
24+
; CHECK-LLVM: [[StoreMD]] = !{[[CC2:![0-9]+]], [[CC3:![0-9]+]]}
25+
; CHECK-LLVM: [[CC2]] = !{i32 6443, i32 0, i32 1}
26+
; CHECK-LLVM: [[CC3]] = !{i32 6443, i32 1, i32 2}
27+
28+
target triple = "spir64-unknown-unknown"
29+
30+
define spir_kernel void @test(ptr addrspace(1) %buffer) {
31+
entry:
32+
%arrayidx = getelementptr inbounds i32, ptr addrspace(1) %buffer, i64 1, !spirv.Decorations !3
33+
%0 = load i32, ptr addrspace(1) %arrayidx, align 4
34+
%arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %buffer, i64 0, !spirv.Decorations !6
35+
store i32 %0, ptr addrspace(1) %arrayidx1, align 4
36+
ret void
37+
}
38+
39+
!spirv.MemoryModel = !{!0}
40+
!spirv.Source = !{!1}
41+
!opencl.spir.version = !{!2}
42+
!opencl.ocl.version = !{!2}
43+
44+
!0 = !{i32 2, i32 2}
45+
!1 = !{i32 3, i32 102000}
46+
!2 = !{i32 1, i32 2}
47+
!3 = !{!4, !5}
48+
!4 = !{i32 6442, i32 0, i32 1} ; {CacheControlLoadINTEL, CacheLevel=0, Cached}
49+
!5 = !{i32 6442, i32 1, i32 1} ; {CacheControlLoadINTEL, CacheLevel=1, Cached}
50+
!6 = !{!7, !8}
51+
!7 = !{i32 6443, i32 0, i32 1} ; {CacheControlStoreINTEL, CacheLevel=0, WriteThrough}
52+
!8 = !{i32 6443, i32 1, i32 2} ; {CacheControlStoreINTEL, CacheLevel=1, WriteBack}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_cache_controls -spirv-text %t.bc -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3+
; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_cache_controls %t.bc -o %t.spv
4+
; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM
5+
6+
; CHECK-SPIRV-DAG: Store [[StorePtr:[0-9]+]]
7+
8+
; CHECK-SPIRV-DAG: Decorate [[StorePtr]] CacheControlStoreINTEL 0 1
9+
; CHECK-SPIRV-DAG: Decorate [[StorePtr]] CacheControlStoreINTEL 1 3
10+
11+
; CHECK-LLVM: @p = common addrspace(1) global i32 0, align 4, !spirv.Decorations [[GlobalMD:![0-9]+]]
12+
; CHECK-LLVM: store i32 0, ptr addrspace(1) @p, align 4
13+
14+
; CHECK-LLVM-DAG: [[CC0:![0-9]+]] = !{i32 6443, i32 0, i32 1}
15+
; CHECK-LLVM-DAG: [[CC1:![0-9]+]] = !{i32 6443, i32 1, i32 3}
16+
; CHECK-LLVM-DAG: [[GlobalMD]] = {{.*}}[[CC0]]{{.*}}[[CC1]]
17+
18+
target triple = "spir64-unknown-unknown"
19+
20+
@p = common addrspace(1) global i32 0, align 4, !spirv.Decorations !3
21+
22+
define spir_kernel void @test() {
23+
entry:
24+
store i32 0, i32 addrspace(1)* @p, align 4
25+
ret void
26+
}
27+
28+
!spirv.MemoryModel = !{!0}
29+
!spirv.Source = !{!1}
30+
!opencl.spir.version = !{!2}
31+
!opencl.ocl.version = !{!2}
32+
33+
!0 = !{i32 2, i32 2}
34+
!1 = !{i32 3, i32 102000}
35+
!2 = !{i32 1, i32 2}
36+
!3 = !{!4, !5}
37+
!4 = !{i32 6443, i32 0, i32 1} ; {CacheControlStoreINTEL, CacheLevel=0, WriteThrough}
38+
!5 = !{i32 6443, i32 1, i32 3} ; {CacheControlStoreINTEL, CacheLevel=1, Streaming}

0 commit comments

Comments
 (0)