[clang] [llvm] [SPIRV] Add support for the `SPV_EXT_long_vector` extension (PR #210279)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 17 02:43:24 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Alex Voicu (AlexVlx)
<details>
<summary>Changes</summary>
This adds support for <https://github.khronos.org/SPIRV-Registry/extensions/EXT/SPV_EXT_long_vector.html>, which (in brief) allows any and all vector ranks to be used in SPIR-V, via a new `OpTypeVectorIdEXT` type. The latter can be used anywhere an `OpTypeVector` can be used.
The change itself is a bit of a chonk because:
- it was necessary to deal with oddities around single element vectors (`IRTranslator` really does not like them);
- handling and interacting with vectors is pretty spread out.
---
Patch is 1.47 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/210279.diff
47 Files Affected:
- (modified) llvm/docs/SPIRVUsage.rst (+2)
- (modified) llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp (+7-8)
- (modified) llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp (+2-3)
- (modified) llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp (+2-1)
- (modified) llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp (+50-30)
- (modified) llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp (+63-33)
- (modified) llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h (+9-1)
- (modified) llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp (+104-7)
- (modified) llvm/lib/Target/SPIRV/SPIRVInstrInfo.td (+8-6)
- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+118-59)
- (modified) llvm/lib/Target/SPIRV/SPIRVLegalizePointerCast.cpp (+10-4)
- (modified) llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp (+31-3)
- (modified) llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp (+20-4)
- (modified) llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp (+3-2)
- (modified) llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td (+2)
- (modified) llvm/lib/Target/SPIRV/SPIRVUtils.cpp (+5)
- (modified) llvm/lib/Target/SPIRV/SPIRVUtils.h (+21-4)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/bool-vector-bitcast.ll (+373)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/ctpop.ll (+21)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/getelementptr-vector-index.ll (+26)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/integer-casts.ll (+334)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/add.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/and.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fadd.ll (+68)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fmax.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fmaximum.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fmin.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fminimum.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/fmul.ll (+68)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/mul.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/or.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/smax.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/smin.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/umax.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/umin.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/llvm-vector-reduce/xor.ll (+64)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/phi-large-vector.ll (+38)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/ptrmask-vec.ll (+34)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/single-element-vector-nested-aggregate.ll (+137)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/single-element-vector.ll (+54)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/spv-extractelt-legalization.ll (+49)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/unmerge-crash-0.ll (+3606)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/unmerge-crash-1.ll (+2426)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/vector-arithmetic.ll (+129)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/vector-index-scalarization.ll (+89)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/vector-legalization-kernel.ll (+27)
- (added) llvm/test/CodeGen/SPIRV/extensions/SPV_EXT_long_vector/vector-of-pointers-gep.ll (+259)
``````````diff
diff --git a/llvm/docs/SPIRVUsage.rst b/llvm/docs/SPIRVUsage.rst
index a820e2e6ff6e4..6d30ec3cbd682 100644
--- a/llvm/docs/SPIRVUsage.rst
+++ b/llvm/docs/SPIRVUsage.rst
@@ -161,6 +161,8 @@ Below is a list of supported SPIR-V extensions, sorted alphabetically by their e
- Adds an instruction that prevents fast-math optimizations between its argument and the expression that contains it.
* - ``SPV_EXT_demote_to_helper_invocation``
- Adds an instruction that demotes a fragment shader invocation to a helper invocation.
+ * - ``SPV_EXT_long_vector``
+ - Adds support for any vector rank.
* - ``SPV_EXT_optnone``
- Adds OptNoneEXT value for Function Control mask that indicates a request to not optimize the function.
* - ``SPV_EXT_shader_atomic_float16_add``
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 9a6b6e3fd4d7b..262d586196f49 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -440,7 +440,7 @@ buildBoolRegister(MachineIRBuilder &MIRBuilder, SPIRVTypeInst ResultType,
LLT Type;
SPIRVTypeInst BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
- if (ResultType->getOpcode() == SPIRV::OpTypeVector) {
+ if (isVectorType(ResultType)) {
unsigned VectorElements = GR->getScalarOrVectorComponentCount(ResultType);
BoolType = GR->getOrCreateSPIRVVectorType(BoolType, VectorElements,
MIRBuilder, true);
@@ -465,7 +465,7 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
SPIRVTypeInst ReturnType, SPIRVGlobalRegistry *GR) {
Register TrueConst, FalseConst;
- if (ReturnType->getOpcode() == SPIRV::OpTypeVector) {
+ if (isVectorType(ReturnType)) {
unsigned Bits = GR->getScalarOrVectorBitWidth(ReturnType);
uint64_t AllOnes = APInt::getAllOnes(Bits).getZExtValue();
TrueConst =
@@ -1790,7 +1790,7 @@ static bool generateBuiltinVar(const SPIRV::IncomingCall *Call,
// Build a load instruction for the builtin variable.
unsigned BitWidth = GR->getScalarOrVectorBitWidth(Call->ReturnType);
LLT LLType;
- if (Call->ReturnType->getOpcode() == SPIRV::OpTypeVector)
+ if (isVectorType(Call->ReturnType))
LLType = LLT::fixed_vector(
GR->getScalarOrVectorComponentCount(Call->ReturnType), BitWidth);
else
@@ -1906,9 +1906,8 @@ static bool generateDotOrFMulInst(StringRef DemangledCall,
return buildOpFromWrapper(MIRBuilder, SPIRV::OpDot, Call,
GR->getSPIRVTypeID(Call->ReturnType));
- bool IsVec = GR->getSPIRVTypeForVReg(Call->Arguments[0])->getOpcode() ==
- SPIRV::OpTypeVector;
// Use OpDot only in case of vector args and OpFMul in case of scalar args.
+ bool IsVec = isVectorType(GR->getSPIRVTypeForVReg(Call->Arguments[0]));
uint32_t OC = IsVec ? SPIRV::OpDot : SPIRV::OpFMulS;
bool IsSwapReq = false;
@@ -2043,7 +2042,7 @@ static bool generateICarryBorrowInst(const SPIRV::IncomingCall *Call,
SPIRVTypeInst OpType2 = GR->getSPIRVTypeForVReg(Call->Arguments[2]);
if (!OpType1 || !OpType2 || OpType1 != OpType2)
report_fatal_error("Operands must have the same type");
- if (OpType1->getOpcode() == SPIRV::OpTypeVector)
+ if (isVectorType(OpType1))
switch (Opcode) {
case SPIRV::OpIAddCarryS:
Opcode = SPIRV::OpIAddCarryV;
@@ -2212,7 +2211,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
"Invalid composite index!");
Register TypeReg = GR->getSPIRVTypeID(Call->ReturnType);
SPIRVTypeInst NewType = nullptr;
- if (QueryResultType->getOpcode() == SPIRV::OpTypeVector) {
+ if (isVectorType(QueryResultType)) {
NewType = GR->getScalarOrVectorComponentType(QueryResultType);
Register NewTypeReg = GR->getSPIRVTypeID(NewType);
if (TypeReg != NewTypeReg)
@@ -2346,7 +2345,7 @@ static bool generateReadImageInst(StringRef DemangledCall,
Register Lod = GR->buildConstantFP(APFloat::getZero(APFloat::IEEEsingle()),
MIRBuilder);
- if (Call->ReturnType->getOpcode() != SPIRV::OpTypeVector) {
+ if (!isVectorType(Call->ReturnType)) {
SPIRVTypeInst TempType =
GR->getOrCreateSPIRVVectorType(Call->ReturnType, 4, MIRBuilder, true);
Register TempRegister =
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index 660bee0f7a2cd..72627f872bd7b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -279,7 +279,7 @@ SPIRVCombinerHelper::extractRows(Register MatrixReg, uint32_t NumRows,
// If there is only one column, then each row is a scalar that needs
// to be extracted.
if (NumCols == 1) {
- assert(SpvRowType->getOpcode() != SPIRV::OpTypeVector);
+ assert(!isVectorType(SpvRowType));
for (uint32_t I = 0; I < NumRows; ++I)
Rows.push_back(MRI.createGenericVirtualRegister(VecTy));
Builder.buildUnmerge(Rows, MatrixReg);
@@ -310,13 +310,12 @@ SPIRVCombinerHelper::extractRows(Register MatrixReg, uint32_t NumRows,
Register SPIRVCombinerHelper::computeDotProduct(Register RowA, Register ColB,
SPIRVTypeInst SpvVecType,
SPIRVGlobalRegistry *GR) const {
- bool IsVectorOp = SpvVecType->getOpcode() == SPIRV::OpTypeVector;
SPIRVTypeInst SpvScalarType = GR->getScalarOrVectorComponentType(SpvVecType);
bool IsFloatOp = SpvScalarType->getOpcode() == SPIRV::OpTypeFloat;
LLT VecTy = GR->getRegType(SpvVecType);
Register DotRes;
- if (IsVectorOp) {
+ if (isVectorType(SpvVecType)) {
LLT ScalarTy = VecTy.getElementType();
Intrinsic::SPVIntrinsics DotIntrinsic =
(IsFloatOp ? Intrinsic::spv_fdot : Intrinsic::spv_udot);
diff --git a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
index 4608f560e1acf..2fe23996b8cc2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
@@ -179,7 +179,8 @@ static const StringMap<SPIRV::Extension::Extension> SPIRVExtensionMap = {
{"SPV_AMD_weak_linkage", SPIRV::Extension::Extension::SPV_AMD_weak_linkage},
{"SPV_KHR_abort", SPIRV::Extension::Extension::SPV_KHR_abort},
{"SPV_KHR_poison_freeze",
- SPIRV::Extension::Extension::SPV_KHR_poison_freeze}};
+ SPIRV::Extension::Extension::SPV_KHR_poison_freeze},
+ {"SPV_EXT_long_vector", SPIRV::Extension::Extension::SPV_EXT_long_vector}};
bool SPIRVExtensionsParser::parse(cl::Option &O, StringRef ArgName,
StringRef ArgValue, ExtensionSet &Vals) {
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 19e1e71488ee3..792214b547339 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -188,6 +188,7 @@ class SPIRVEmitIntrinsics
Function *CurrF = nullptr;
bool TrackConstants = true;
bool HaveFunPtrs = false;
+ bool CanUseAnyVectorRank = false;
DenseMap<Instruction *, Constant *> AggrConsts;
DenseMap<Instruction *, Type *> AggrConstTypes;
SmallPtrSet<Instruction *, 0> AggrStores;
@@ -617,8 +618,9 @@ CallInst *SPIRVEmitIntrinsics::buildSpvPtrcast(Function *F, Value *Op,
}
Type *OpTy = Op->getType();
SmallVector<Type *, 2> Types = {OpTy, OpTy};
- SmallVector<Value *, 2> Args = {Op, buildMD(getNormalizedPoisonValue(ElemTy)),
- B.getInt32(getPointerAddressSpace(OpTy))};
+ SmallVector<Value *, 2> Args = {
+ Op, buildMD(getNormalizedPoisonValue(ElemTy, CanUseAnyVectorRank)),
+ B.getInt32(getPointerAddressSpace(OpTy))};
CallInst *PtrCasted =
B.CreateIntrinsicWithoutFolding(Intrinsic::spv_ptrcast, {Types}, Args);
GR->buildAssignPtr(B, ElemTy, PtrCasted);
@@ -1092,7 +1094,7 @@ Type *SPIRVEmitIntrinsics::deduceElementTypeHelper(
// remember the found relationship
if (Ty && !IgnoreKnownType) {
// specify nested types if needed, otherwise return unchanged
- GR->addDeducedElementType(I, normalizeType(Ty));
+ GR->addDeducedElementType(I, normalizeType(Ty, CanUseAnyVectorRank));
}
return Ty;
@@ -1178,7 +1180,8 @@ SPIRVEmitIntrinsics::deduceNestedTypeHelper(User *U, Type *OrigTy,
}
if (Ty != OpTy) {
Type *NewTy = VectorType::get(Ty, VecTy->getElementCount());
- GR->addDeducedCompositeType(U, normalizeType(NewTy));
+ GR->addDeducedCompositeType(U,
+ normalizeType(NewTy, CanUseAnyVectorRank));
return NewTy;
}
}
@@ -1335,7 +1338,7 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeFunctionRet(
if (KnownElemTy)
return false;
if (Type *OpElemTy = GR->findDeducedElementType(Op)) {
- OpElemTy = normalizeType(OpElemTy);
+ OpElemTy = normalizeType(OpElemTy, CanUseAnyVectorRank);
GR->addDeducedElementType(F, OpElemTy);
GR->addReturnType(
F, TypedPointerType::get(OpElemTy,
@@ -1349,7 +1352,8 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeFunctionRet(
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr(CI)) {
if (Type *PrevElemTy = GR->findDeducedElementType(CI)) {
GR->updateAssignType(AssignCI, CI,
- getNormalizedPoisonValue(OpElemTy));
+ getNormalizedPoisonValue(OpElemTy,
+ CanUseAnyVectorRank));
propagateElemType(CI, PrevElemTy, VisitedSubst);
}
}
@@ -1533,7 +1537,7 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(
Type *Ty = AskTy ? AskTy : GR->findDeducedElementType(Op);
if (Ty == KnownElemTy)
continue;
- Value *OpTyVal = getNormalizedPoisonValue(KnownElemTy);
+ Value *OpTyVal = getNormalizedPoisonValue(KnownElemTy, CanUseAnyVectorRank);
Type *OpTy = Op->getType();
// Do not let a non-pointer element type clobber an already-deduced pointer
// pointee.
@@ -1543,7 +1547,8 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(
if (Op->hasUseList() && !WouldClobberPtrWithNonPtr &&
(!Ty || AskTy || isUntypedPointerTy(Ty) || isTodoType(Op))) {
Type *PrevElemTy = GR->findDeducedElementType(Op);
- GR->addDeducedElementType(Op, normalizeType(KnownElemTy));
+ GR->addDeducedElementType(Op, normalizeType(KnownElemTy,
+ CanUseAnyVectorRank));
// check if KnownElemTy is complete
if (!Incomplete)
eraseTodoType(Op);
@@ -2124,7 +2129,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeTargetExt(
CallInst *AssignCI = GR->findAssignPtrTypeInstr(V);
if (!AssignCI) {
- GR->buildAssignType(B, AssignedType, V);
+ GR->buildAssignType(B, AssignedType, V, CanUseAnyVectorRank);
return;
}
@@ -2144,7 +2149,8 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeTargetExt(
// Our previous guess about the type seems to be wrong, let's update
// inferred type according to a new, more precise type information.
- GR->updateAssignType(AssignCI, V, getNormalizedPoisonValue(AssignedType));
+ GR->updateAssignType(
+ AssignCI, V, getNormalizedPoisonValue(AssignedType, CanUseAnyVectorRank));
}
void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
@@ -2159,7 +2165,8 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
return;
setInsertPointSkippingPhis(B, I);
- Value *ExpectedElementVal = getNormalizedPoisonValue(ExpectedElementType);
+ Value *ExpectedElementVal = getNormalizedPoisonValue(ExpectedElementType,
+ CanUseAnyVectorRank);
MetadataAsValue *VMD = buildMD(ExpectedElementVal);
unsigned AddressSpace = getPointerAddressSpace(Pointer->getType());
bool FirstPtrCastOrAssignPtrType = true;
@@ -2333,7 +2340,8 @@ void SPIRVEmitIntrinsics::insertPtrCastOrAssignTypeInstr(Instruction *I,
if (!ElemTy) {
ElemTy = getPointeeTypeByCallInst(DemangledName, CalledF, OpIdx);
if (ElemTy) {
- GR->addDeducedElementType(CalledArg, normalizeType(ElemTy));
+ GR->addDeducedElementType(CalledArg,
+ normalizeType(ElemTy, CanUseAnyVectorRank));
} else {
for (User *U : CalledArg->users()) {
if (Instruction *Inst = dyn_cast<Instruction>(U)) {
@@ -2386,7 +2394,7 @@ void SPIRVEmitIntrinsics::insertPtrCastOrAssignTypeInstr(Instruction *I,
Instruction *SPIRVEmitIntrinsics::visitInsertElementInst(InsertElementInst &I) {
// If it's a <1 x Type> vector type, don't modify it. It's not a legal vector
// type in LLT and IRTranslator will replace it by the scalar.
- if (isVector1(I.getType()))
+ if (isVector1(I.getType()) && !CanUseAnyVectorRank)
return &I;
SmallVector<Type *, 4> Types = {I.getType(), I.getOperand(0)->getType(),
@@ -2405,7 +2413,7 @@ Instruction *
SPIRVEmitIntrinsics::visitExtractElementInst(ExtractElementInst &I) {
// If it's a <1 x Type> vector type, don't modify it. It's not a legal vector
// type in LLT and IRTranslator will replace it by the scalar.
- if (isVector1(I.getVectorOperandType()))
+ if (isVector1(I.getVectorOperandType()) && !CanUseAnyVectorRank)
return &I;
IRBuilder<> B(I.getParent());
@@ -2843,7 +2851,8 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
switch (ResIt->second) {
case WellKnownTypes::Event:
GR->buildAssignType(
- B, TargetExtType::get(I->getContext(), "spirv.Event"), I);
+ B, TargetExtType::get(I->getContext(), "spirv.Event"), I,
+ CanUseAnyVectorRank);
break;
}
}
@@ -2891,7 +2900,7 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
} else if (auto It = AggrConstTypes.find(I); It != AggrConstTypes.end())
TypeToAssign = It->second;
TypeToAssign = restoreMutatedType(GR, I, TypeToAssign);
- GR->buildAssignType(B, TypeToAssign, I);
+ GR->buildAssignType(B, TypeToAssign, I, CanUseAnyVectorRank);
}
for (const auto &Op : I->operands()) {
if (isa<ConstantPointerNull>(Op) || isa<UndefValue>(Op) ||
@@ -2920,11 +2929,13 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
if (OpTy->isTargetExtTy()) {
// We need to do this in order to be consistent with how target ext
// types are handled in `processInstrAfterVisit`
- OpTyVal = getNormalizedPoisonValue(OpTy);
+ OpTyVal = getNormalizedPoisonValue(OpTy, CanUseAnyVectorRank);
}
CallInst *AssignCI =
buildIntrWithMD(Intrinsic::spv_assign_type, {OpTy},
- getNormalizedPoisonValue(OpTy), OpTyVal, {}, B);
+ getNormalizedPoisonValue(OpTy,
+ CanUseAnyVectorRank),
+ OpTyVal, {}, B);
GR->addAssignPtrTypeInstr(OpTyVal, AssignCI);
}
}
@@ -3238,7 +3249,7 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
if (OpTy->isTargetExtTy()) {
// Since this value is replaced by poison, we need to do the same in
// `insertAssignTypeIntrs`.
- Value *OpTyVal = getNormalizedPoisonValue(OpTy);
+ Value *OpTyVal = getNormalizedPoisonValue(OpTy, CanUseAnyVectorRank);
NewOp = buildIntrWithMD(Intrinsic::spv_track_constant,
{OpTy, OpTyVal->getType()}, Op, OpTyVal, {}, B);
}
@@ -3246,7 +3257,8 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
OpElemTy != IntegerType::getInt8Ty(I->getContext())) {
SmallVector<Type *, 2> Types = {OpTy, OpTy};
SmallVector<Value *, 2> Args = {
- NewOp, buildMD(getNormalizedPoisonValue(OpElemTy)),
+ NewOp,
+ buildMD(getNormalizedPoisonValue(OpElemTy, CanUseAnyVectorRank)),
B.getInt32(getPointerAddressSpace(OpTy))};
CallInst *PtrCasted = B.CreateIntrinsicWithoutFolding(
Intrinsic::spv_ptrcast, {Types}, Args);
@@ -3393,7 +3405,9 @@ void SPIRVEmitIntrinsics::processParamTypes(Function *F, IRBuilder<> &B) {
if (!ElemTy && (ElemTy = deduceFunParamElementType(F, OpIdx)) != nullptr) {
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr(Arg)) {
DenseSet<std::pair<Value *, Value *>> VisitedSubst;
- GR->updateAssignType(AssignCI, Arg, getNormalizedPoisonValue(ElemTy));
+ GR->updateAssignType(
+ AssignCI, Arg,
+ getNormalizedPoisonValue(ElemTy, CanUseAnyVectorRank));
propagateElemType(Arg, IntegerType::getInt8Ty(F->getContext()),
VisitedSubst);
} else {
@@ -3447,7 +3461,8 @@ bool SPIRVEmitIntrinsics::processFunctionPointers(Module &M) {
continue;
if (II->getIntrinsicID() == Intrinsic::spv_assign_ptr_type ||
II->getIntrinsicID() == Intrinsic::spv_ptrcast) {
- GR->updateAssignType(II, &F, getNormalizedPoisonValue(FPElemTy));
+ GR->updateAssignType(
+ II, &F, getNormalizedPoisonValue(FPElemTy, CanUseAnyVectorRank));
break;
}
}
@@ -3464,7 +3479,8 @@ bool SPIRVEmitIntrinsics::processFunctionPointers(Module &M) {
for (Function *F : Worklist) {
SmallVector<Value *> Args;
for (const auto &Arg : F->args())
- Args.push_back(getNormalizedPoisonValue(Arg.getType()));
+ Args.push_back(getNormalizedPoisonValue(Arg.getType(),
+ CanUseAnyVectorRank));
IRB.CreateCall(F, Args);
}
IRB.CreateRetVoid();
@@ -3495,10 +3511,11 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
GR->buildAssignPtr(B, ElemTy, Arg);
}
} else if (isaGEP(Param)) {
- replaceUsesOfWithSpvPtrcast(Param, normalizeType(ElemTy), CI,
- Ptrcasts);
+ replaceUsesOfWithSpvPtrcast(
+ Param, normalizeType(ElemTy, CanUseAnyVectorRank), CI, Ptrcasts);
} else if (isa<Instruction>(Param)) {
- GR->addDeducedElementType(Param, normalizeType(ElemTy));
+ GR->addDeducedElementType(Param, normalizeType(ElemTy,
+ CanUseAnyVectorRank));
// insertAssignTypeIntrs() will complete buildAssignPtr()
} else {
B.SetInsertPoint(CI->getParent()
@@ -3514,7 +3531,7 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
if (!RefF || !isPointerTy(RefF->getReturnType()) ||
GR->findDeducedElementType(RefF))
continue;
- ElemTy = normalizeType(ElemTy);
+ ElemTy = normalizeType(ElemTy, CanUseAnyVectorRank);
GR->addDeducedElementType(RefF, ElemTy);
GR->addReturnType(
RefF, TypedPointerType::get(
@@ -3619,6 +3636,8 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
HaveFunPtrs =
ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers);
+ CanUseAnyVectorRank =
+ ST.canUseExtension(SPIRV::Extension::SPV_EXT_long_vector);
CurrF = &Func;
IRBuilder<> B(Func.getContext());
AggrConsts.clear();
@@ -3638,8 +3657,9 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
continue;
if (SGEP) {
- GR->addDeducedElementType(SGEP,
- normalizeType(SGEP->getResultElementType()));
+ GR->addDeducedElementType(
+ SGEP, normalizeType(SGEP->getResultElementType(),
+ CanUseAnyVectorRank));
continue;
}
@@ -3650,7 +3670,7 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
GEP = NewGEP;
}
if (Type *GepTy = getGEPType(GEP))
- GR->addDeducedElementType(GEP, normalizeType(GepTy));
+ GR->addDeducedElementType(GEP, normalizeType(GepTy, CanUseAnyVectorRank));
}
// Remove dead instructions that were simplified and replaced.
for (auto *I : DeadInsts) {
diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
index 4ba98651fb2d6..11...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/210279
More information about the cfe-commits
mailing list