================ @@ -491,19 +491,41 @@ void VPlanTransforms::removeDeadRecipes(VPlan &Plan) { static VPValue *createScalarIVSteps(VPlan &Plan, const InductionDescriptor &ID, ScalarEvolution &SE, Instruction *TruncI, - Type *IVTy, VPValue *StartV, - VPValue *Step) { + VPValue *StartV, VPValue *Step) { VPBasicBlock *HeaderVPBB = Plan.getVectorLoopRegion()->getEntryBasicBlock(); auto IP = HeaderVPBB->getFirstNonPhi(); VPCanonicalIVPHIRecipe *CanonicalIV = Plan.getCanonicalIV(); - Type *TruncTy = TruncI ? TruncI->getType() : IVTy; VPValue *BaseIV = CanonicalIV; - if (!CanonicalIV->isCanonical(ID.getKind(), StartV, Step, TruncTy)) { - BaseIV = new VPDerivedIVRecipe(ID, StartV, CanonicalIV, Step, - TruncI ? TruncI->getType() : nullptr); + VPTypeAnalysis TypeInfo(SE.getContext()); + Type *StepTy = TypeInfo.inferScalarType(Step); + if (!CanonicalIV->isCanonical(ID.getKind(), StartV, Step)) { + BaseIV = new VPDerivedIVRecipe(ID, StartV, CanonicalIV, Step); HeaderVPBB->insert(BaseIV->getDefiningRecipe(), IP); } + // Truncate base induction if needed. + if (TruncI) { + Type *TruncTy = TruncI->getType(); + assert(TypeInfo.inferScalarType(BaseIV)->getScalarSizeInBits() > + TruncTy->getScalarSizeInBits() && + StepTy->isIntegerTy() && "Truncation requires an integer step"); + auto *T = new VPScalarCastRecipe(Instruction::Trunc, BaseIV, TruncTy); + HeaderVPBB->insert(T, IP); + BaseIV = T; ---------------- ayalz wrote:
There's no real need in `T`, and more consistent to simply redefine BaseIV = new ... (..., BaseIV, ...), again, as in the proposal above? https://github.com/llvm/llvm-project/pull/78113 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits