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 
&lt;https://github.khronos.org/SPIRV-Registry/extensions/EXT/SPV_EXT_long_vector.html&gt;,
 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

Reply via email to