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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
