Skip to content

Commit

Permalink
Remove JointMatrixINTEL W/S (intel#1658)
Browse files Browse the repository at this point in the history
It's not longer needed after intel#6535

Signed-off-by: Sidorov, Dmitry <[email protected]>

Original commit:
KhronosGroup/SPIRV-LLVM-Translator@7a559fa
  • Loading branch information
MrSidims authored and preethi-intel committed Oct 26, 2022
1 parent 800bbea commit dbfe3ea
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 196 deletions.
119 changes: 0 additions & 119 deletions llvm-spirv/lib/SPIRV/SPIRVRegularizeLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -346,122 +346,6 @@ Value *SPIRVRegularizeLLVMBase::extendBitInstBoolArg(Instruction *II) {
}
}

void SPIRVRegularizeLLVMBase::adaptStructTypes(StructType *ST) {
if (!ST->hasName())
return;
StringRef STName = ST->getName();
STName.consume_front("struct.");
STName.consume_front("__spv::");
StringRef MangledName = STName.substr(0, STName.find('.'));

// Older versions of clang will generate JointMatrixINTEL types using this
// representation. Newer versions will generate the correct struct name
// "%spirv.JointMatrixINTEL._{parameters}" directly, obviating the need for
// this check.
// Representation in LLVM IR before the translator is a pointer array wrapped
// in a structure:
// %struct.__spirv_JointMatrixINTEL = type { [R x [C x [L x [S x type]]]]* }
// where R = Rows, C = Columnts, L = Layout + 1, S = Scope + 1
// this '+1' for the Layout and Scope is required because both of them can
// be '0', but array size can not be '0'.
// The result should look like SPIR-V friendly LLVM IR:
// %spirv.JointMatrixINTEL._char_2_2_0_3
// Here we check the structure name yet again. Another option would be to
// check SPIR-V friendly function calls (by their name) and obtain return
// or their parameter types, assuming, that the appropriate types are Matrix
// structure type. But in the near future, we will reuse Composite
// instructions to do, for example, matrix initialization directly on AMX
// register by OpCompositeConstruct. And we can't claim, that the Result type
// of OpCompositeConstruct instruction is always the joint matrix type, it's
// simply not true.
if (MangledName == "__spirv_JointMatrixINTEL" && !ST->isOpaquePointerTy()) {
auto *PtrTy = dyn_cast<PointerType>(ST->getElementType(0));
assert(PtrTy &&
"Expected a pointer to an array to represent joint matrix type");
std::vector<size_t> TypeLayout;
ArrayType *ArrayTy =
dyn_cast<ArrayType>(PtrTy->getNonOpaquePointerElementType());
assert(ArrayTy && "Expected a pointer element type of an array type to "
"represent joint matrix type");
TypeLayout.push_back(ArrayTy->getNumElements());
for (size_t I = 1; I != 4; ++I) {
ArrayTy = dyn_cast<ArrayType>(ArrayTy->getElementType());
assert(ArrayTy &&
"Expected a element type to represent joint matrix type");
TypeLayout.push_back(ArrayTy->getNumElements());
}
// JointMatrixINTEL type can have optional 'Use' parameter, which is encoded
// as another array dimention. In case if it has default 'Unnecessary' (4)
// parameter - ignore it.
if (isa<ArrayType>(ArrayTy->getElementType())) {
ArrayTy = cast<ArrayType>(ArrayTy->getElementType());
uint32_t UseInt = ArrayTy->getNumElements();
assert(UseInt <= 4 && "Use parameter encoded in the array must be < 5 ");
if (UseInt != 4)
TypeLayout.push_back(UseInt);
}

auto *ElemTy = ArrayTy->getElementType();
std::string ElemTyStr;
if (ElemTy->isIntegerTy()) {
auto *IntElemTy = cast<IntegerType>(ElemTy);
switch (IntElemTy->getBitWidth()) {
case 8:
ElemTyStr = "char";
break;
case 16:
ElemTyStr = "short";
break;
case 32:
ElemTyStr = "int";
break;
case 64:
ElemTyStr = "long";
break;
default:
ElemTyStr = "i" + std::to_string(IntElemTy->getBitWidth());
}
}
// Check half type like this as well, but in DPC++ it most likelly will
// be a class
else if (ElemTy->isHalfTy())
ElemTyStr = "half";
else if (ElemTy->isFloatTy())
ElemTyStr = "float";
else if (ElemTy->isDoubleTy())
ElemTyStr = "double";
else {
// Half type is special: in DPC++ we use `class half` instead of `half`
// type natively supported by Clang.
auto *STElemTy = dyn_cast<StructType>(ElemTy);
if (!STElemTy && !STElemTy->hasName())
llvm_unreachable("Unexpected type for matrix!");
if (isSYCLHalfType(ElemTy))
ElemTyStr = "half";
if (isSYCLBfloat16Type(ElemTy))
ElemTyStr = "bfloat16";
if (ElemTyStr.size() == 0)
llvm_unreachable("Unexpected type for matrix!");
}
std::stringstream SPVName;
SPVName << kSPIRVTypeName::PrefixAndDelim
<< kSPIRVTypeName::JointMatrixINTEL << kSPIRVTypeName::Delimiter
<< kSPIRVTypeName::PostfixDelim << ElemTyStr
<< kSPIRVTypeName::PostfixDelim << std::to_string(TypeLayout[0])
<< kSPIRVTypeName::PostfixDelim << std::to_string(TypeLayout[1])
<< kSPIRVTypeName::PostfixDelim << std::to_string(TypeLayout[2] - 1)
<< kSPIRVTypeName::PostfixDelim
<< std::to_string(TypeLayout[3] - 1);
if (TypeLayout.size() == 5)
SPVName << kSPIRVTypeName::PostfixDelim
<< std::to_string(TypeLayout[4] - 1);
// Note, that this structure is not opaque and there is no way to make it
// opaque but to recreate it entirely and replace it everywhere. Lets
// keep the structure as is, dealing with it during SPIR-V generation.
ST->setName(SPVName.str());
}
}

bool SPIRVRegularizeLLVMBase::runRegularizeLLVM(Module &Module) {
M = &Module;
Ctx = &M->getContext();
Expand Down Expand Up @@ -633,9 +517,6 @@ bool SPIRVRegularizeLLVMBase::regularize() {
}
}

for (StructType *ST : M->getIdentifiedStructTypes())
adaptStructTypes(ST);

if (SPIRVDbgSaveRegularizedModule)
saveLLVMModule(M, RegularizedModuleTmpFile);
return true;
Expand Down
1 change: 0 additions & 1 deletion llvm-spirv/lib/SPIRV/SPIRVRegularizeLLVM.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ class SPIRVRegularizeLLVMBase {
Value *extendBitInstBoolArg(llvm::Instruction *OldInst);

static std::string lowerLLVMIntrinsicName(llvm::IntrinsicInst *II);
void adaptStructTypes(llvm::StructType *ST);
static char ID;

private:
Expand Down
40 changes: 17 additions & 23 deletions llvm-spirv/test/transcoding/SPV_INTEL_joint_matrix/joint_matrix.ll
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
; RUN: llvm-as < %s -o %t.bc
; RUN: llvm-spirv %t.bc -s -o %t.pre.bc
; RUN: llvm-dis %t.pre.bc -o - | FileCheck %s --check-prefix=CHECK-PRE
; RUN: llvm-spirv %t.bc -spirv-ext=+SPV_INTEL_joint_matrix -o %t.spv
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV

; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM

; CHECK-PRE: %spirv.JointMatrixINTEL._short_2_2_0_3
; CHECK-PRE: %spirv.JointMatrixINTEL._char_2_16_0_3_0
; CHECK-PRE: %spirv.JointMatrixINTEL._char_16_2_3_3

; CHECK-SPIRV: Capability JointMatrixINTEL
; CHECK-SPIRV: Extension "SPV_INTEL_joint_matrix"
; CHECK-SPIRV: EntryPoint 6 [[#Kernel:]]
Expand Down Expand Up @@ -67,9 +61,9 @@ source_filename = "./joint_matrix_test.cpp"
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"
target triple = "spir64-unknown-unknown"

%"struct.__spv::__spirv_JointMatrixINTEL" = type { [2 x [2 x [1 x [4 x [4 x i16]]]]]* }
%"struct.__spv::__spirv_JointMatrixINTEL.0" = type { [2 x [16 x [1 x [4 x [1 x i8]]]]]* }
%"struct.__spv::__spirv_JointMatrixINTEL.2" = type { [16 x [2 x [4 x [4 x i8]]]]* }
%spirv.JointMatrixINTEL._short_2_2_0_3 = type { [2 x [2 x [1 x [4 x [4 x i16]]]]]* }
%spirv.JointMatrixINTEL._char_2_16_0_3_0 = type { [2 x [16 x [1 x [4 x [1 x i8]]]]]* }
%spirv.JointMatrixINTEL._char_16_2_3_3 = type { [16 x [2 x [4 x [4 x i8]]]]* }

$_ZTSZ4mainE11matrix_test = comdat any

Expand Down Expand Up @@ -99,60 +93,60 @@ entry:
%add.ptr.i51 = getelementptr inbounds i16, i16 addrspace(1)* %_arg_, i64 %mul6.i
%add.ptr7.i52 = getelementptr inbounds i16, i16 addrspace(1)* %add.ptr.i51, i64 %sub5.i
%add.ptr7.i = addrspacecast i16 addrspace(1)* %add.ptr7.i52 to i16 addrspace(4)*
%call8.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i16 addrspace(4)* %add.ptr7.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%call8.i = tail call spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i16 addrspace(4)* %add.ptr7.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%add.ptr11.i53 = getelementptr inbounds i8, i8 addrspace(1)* %_arg_3, i64 %mul6.i
%add.ptr16.i55 = getelementptr inbounds i8, i8 addrspace(1)* %_arg_5, i64 %sub5.i
br label %for.cond.i

for.cond.i: ; preds = %for.body.i, %entry
%k.0.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]
%C.0.i = phi %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* [ %call8.i, %entry ], [ %call19.i, %for.body.i ]
%C.0.i = phi %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* [ %call8.i, %entry ], [ %call19.i, %for.body.i ]
%cmp.i = icmp ult i32 %k.0.i, 32
br i1 %cmp.i, label %for.body.i, label %_ZZ4mainENKUlN2cl4sycl7nd_itemILi2EEEE_clES2_.exit

for.body.i: ; preds = %for.cond.i
%idx.ext.i = zext i32 %k.0.i to i64
%add.ptr12.i54 = getelementptr inbounds i8, i8 addrspace(1)* %add.ptr11.i53, i64 %idx.ext.i
%add.ptr12.i = addrspacecast i8 addrspace(1)* %add.ptr12.i54 to i8 addrspace(4)*
%call13.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL.0" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm2ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)* %add.ptr12.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%call13.i = tail call spir_func %spirv.JointMatrixINTEL._char_2_16_0_3_0 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm2ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)* %add.ptr12.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%mul14.i = shl nuw nsw i32 %k.0.i, 5
%idx.ext15.i = zext i32 %mul14.i to i64
%add.ptr17.i56 = getelementptr inbounds i8, i8 addrspace(1)* %add.ptr16.i55, i64 %idx.ext15.i
%add.ptr17.i = addrspacecast i8 addrspace(1)* %add.ptr17.i56 to i8 addrspace(4)*
%call18.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL.2" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm16ELm2ELN5__spv12MatrixLayoutE3ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)* %add.ptr17.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%call19.i = tail call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z27__spirv_JointMatrixMadINTELIasLm2ELm16ELm2ELN5__spv12MatrixLayoutE0ELS1_3ELS1_0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT0_XT1_EXT3_EXT6_EXT7_EEEPNS4_IT_XT1_EXT2_EXT4_EXT7_EEEPNS4_IS8_XT2_EXT3_EXT5_EXT7_EEES7_S3_(%"struct.__spv::__spirv_JointMatrixINTEL.0" addrspace(4)* %call13.i, %"struct.__spv::__spirv_JointMatrixINTEL.2" addrspace(4)* %call18.i, %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %C.0.i, i32 3) #3
%call18.i = tail call spir_func %spirv.JointMatrixINTEL._char_16_2_3_3 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm16ELm2ELN5__spv12MatrixLayoutE3ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)* %add.ptr17.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%call19.i = tail call spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z27__spirv_JointMatrixMadINTELIasLm2ELm16ELm2ELN5__spv12MatrixLayoutE0ELS1_3ELS1_0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT0_XT1_EXT3_EXT6_EXT7_EEEPNS4_IT_XT1_EXT2_EXT4_EXT7_EEEPNS4_IS8_XT2_EXT3_EXT5_EXT7_EEES7_S3_(%spirv.JointMatrixINTEL._char_2_16_0_3_0 addrspace(4)* %call13.i, %spirv.JointMatrixINTEL._char_16_2_3_3 addrspace(4)* %call18.i, %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* %C.0.i, i32 3) #3
%add.i = add nuw nsw i32 %k.0.i, 16
br label %for.cond.i, !llvm.loop !19

_ZZ4mainENKUlN2cl4sycl7nd_itemILi2EEEE_clES2_.exit: ; preds = %for.cond.i
tail call spir_func void @_Z29__spirv_JointMatrixStoreINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(i16 addrspace(4)* %add.ptr7.i, %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* %C.0.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%C.0.i.new = call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z26__spirv_CompositeConstructi(i32 42) #1
tail call spir_func void @_Z29__spirv_JointMatrixStoreINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(i16 addrspace(4)* %add.ptr7.i, %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* %C.0.i, i64 %_arg_1, i32 0, i32 3, i32 0) #3
%C.0.i.new = call spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z26__spirv_CompositeConstructi(i32 42) #1
%ref.tmp = alloca i32, align 4
%ref.tmp.ascast = addrspacecast i32* %ref.tmp to i32 addrspace(4)*
store i32 0, i32 addrspace(4)* %ref.tmp.ascast, align 4
%zero = load i32, i32 addrspace(4)* %ref.tmp.ascast, align 8
%C.0.i.new.load = call spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z26__spirv_CompositeConstructi(i32 %zero) #1
%C.0.i.new.load = call spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z26__spirv_CompositeConstructi(i32 %zero) #1

ret void
}

; Function Attrs: convergent
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i16 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
declare dso_local spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i16 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1

; Function Attrs: convergent
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL.0" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm2ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
declare dso_local spir_func %spirv.JointMatrixINTEL._char_2_16_0_3_0 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm2ELm16ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1

; Function Attrs: convergent
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL.2" addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm16ELm2ELN5__spv12MatrixLayoutE3ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
declare dso_local spir_func %spirv.JointMatrixINTEL._char_16_2_3_3 addrspace(4)* @_Z28__spirv_JointMatrixLoadINTELIaLm16ELm2ELN5__spv12MatrixLayoutE3ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT_XT0_EXT1_EXT2_EXT3_EEEPS5_mS1_S3_i(i8 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1

; Function Attrs: convergent
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z27__spirv_JointMatrixMadINTELIasLm2ELm16ELm2ELN5__spv12MatrixLayoutE0ELS1_3ELS1_0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT0_XT1_EXT3_EXT6_EXT7_EEEPNS4_IT_XT1_EXT2_EXT4_EXT7_EEEPNS4_IS8_XT2_EXT3_EXT5_EXT7_EEES7_S3_(%"struct.__spv::__spirv_JointMatrixINTEL.0" addrspace(4)*, %"struct.__spv::__spirv_JointMatrixINTEL.2" addrspace(4)*, %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*, i32) local_unnamed_addr #1
declare dso_local spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z27__spirv_JointMatrixMadINTELIasLm2ELm16ELm2ELN5__spv12MatrixLayoutE0ELS1_3ELS1_0ELNS0_5Scope4FlagE3EEPNS0_24__spirv_JointMatrixINTELIT0_XT1_EXT3_EXT6_EXT7_EEEPNS4_IT_XT1_EXT2_EXT4_EXT7_EEEPNS4_IS8_XT2_EXT3_EXT5_EXT7_EEES7_S3_(%spirv.JointMatrixINTEL._char_2_16_0_3_0 addrspace(4)*, %spirv.JointMatrixINTEL._char_16_2_3_3 addrspace(4)*, %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)*, i32) local_unnamed_addr #1

; Function Attrs: convergent
declare dso_local spir_func void @_Z29__spirv_JointMatrixStoreINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(i16 addrspace(4)*, %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1
declare dso_local spir_func void @_Z29__spirv_JointMatrixStoreINTELIsLm2ELm2ELN5__spv12MatrixLayoutE0ELNS0_5Scope4FlagE3EEvPT_PNS0_24__spirv_JointMatrixINTELIS4_XT0_EXT1_EXT2_EXT3_EEEmS1_S3_i(i16 addrspace(4)*, %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)*, i64, i32, i32, i32) local_unnamed_addr #1

; Function Attrs: convergent
declare dso_local spir_func %"struct.__spv::__spirv_JointMatrixINTEL" addrspace(4)* @_Z26__spirv_CompositeConstructi(i32) #1
declare dso_local spir_func %spirv.JointMatrixINTEL._short_2_2_0_3 addrspace(4)* @_Z26__spirv_CompositeConstructi(i32) #1

; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn
declare void @llvm.assume(i1 noundef) #2
Expand Down
Loading

0 comments on commit dbfe3ea

Please sign in to comment.