@@ -797,15 +797,8 @@ static VPValue *optimizeEarlyExitInductionUser(VPlan &Plan,
797797 VPValue *FirstActiveLane =
798798 B.createNaryOp (VPInstruction::FirstActiveLane, Mask, DL);
799799 Type *FirstActiveLaneType = TypeInfo.inferScalarType (FirstActiveLane);
800- if (CanonicalIVType != FirstActiveLaneType) {
801- Instruction::CastOps CastOp =
802- CanonicalIVType->getScalarSizeInBits () <
803- FirstActiveLaneType->getScalarSizeInBits ()
804- ? Instruction::Trunc
805- : Instruction::ZExt;
806- FirstActiveLane =
807- B.createScalarCast (CastOp, FirstActiveLane, CanonicalIVType, DL);
808- }
800+ FirstActiveLane = B.createScalarZExtOrTrunc (FirstActiveLane, CanonicalIVType,
801+ FirstActiveLaneType, DL);
809802 EndValue = B.createNaryOp (Instruction::Add, {EndValue, FirstActiveLane}, DL);
810803
811804 // `getOptimizableIVOf()` always returns the pre-incremented IV, so if it
@@ -2182,13 +2175,10 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
21822175 VPValue *MaxEVL = &Plan.getVF ();
21832176 // Emit VPScalarCastRecipe in preheader if VF is not a 32 bits integer.
21842177 VPBuilder Builder (LoopRegion->getPreheaderVPBB ());
2185- if (unsigned VFSize =
2186- TypeInfo.inferScalarType (MaxEVL)->getScalarSizeInBits ();
2187- VFSize != 32 ) {
2188- MaxEVL = Builder.createScalarCast (
2189- VFSize > 32 ? Instruction::Trunc : Instruction::ZExt, MaxEVL,
2190- Type::getInt32Ty (Ctx), DebugLoc ());
2191- }
2178+ MaxEVL = Builder.createScalarZExtOrTrunc (MaxEVL, Type::getInt32Ty (Ctx),
2179+ TypeInfo.inferScalarType (MaxEVL),
2180+ DebugLoc ());
2181+
21922182 Builder.setInsertPoint (Header, Header->getFirstNonPhi ());
21932183 PrevEVL = Builder.createScalarPhi ({MaxEVL, &EVL}, DebugLoc (), " prev.evl" );
21942184 }
@@ -2286,6 +2276,7 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
22862276 return false ;
22872277
22882278 auto *CanonicalIVPHI = Plan.getCanonicalIV ();
2279+ auto *CanIVTy = CanonicalIVPHI->getScalarType ();
22892280 VPValue *StartV = CanonicalIVPHI->getStartValue ();
22902281
22912282 // Create the ExplicitVectorLengthPhi recipe in the main loop.
@@ -2297,8 +2288,8 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
22972288 Instruction::Sub, {Plan.getTripCount (), EVLPhi}, DebugLoc (), " avl" );
22982289 if (MaxSafeElements) {
22992290 // Support for MaxSafeDist for correct loop emission.
2300- VPValue *AVLSafe = Plan. getOrAddLiveIn (
2301- ConstantInt::get (CanonicalIVPHI-> getScalarType () , *MaxSafeElements));
2291+ VPValue *AVLSafe =
2292+ Plan. getOrAddLiveIn ( ConstantInt::get (CanIVTy , *MaxSafeElements));
23022293 VPValue *Cmp = Builder.createICmp (ICmpInst::ICMP_ULT, AVL, AVLSafe);
23032294 AVL = Builder.createSelect (Cmp, AVL, AVLSafe, DebugLoc (), " safe_avl" );
23042295 }
@@ -2308,13 +2299,12 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
23082299 auto *CanonicalIVIncrement =
23092300 cast<VPInstruction>(CanonicalIVPHI->getBackedgeValue ());
23102301 Builder.setInsertPoint (CanonicalIVIncrement);
2311- VPSingleDefRecipe *OpVPEVL = VPEVL;
2312- if (unsigned IVSize = CanonicalIVPHI->getScalarType ()->getScalarSizeInBits ();
2313- IVSize != 32 ) {
2314- OpVPEVL = Builder.createScalarCast (
2315- IVSize < 32 ? Instruction::Trunc : Instruction::ZExt, OpVPEVL,
2316- CanonicalIVPHI->getScalarType (), CanonicalIVIncrement->getDebugLoc ());
2317- }
2302+ VPValue *OpVPEVL = VPEVL;
2303+
2304+ auto *I32Ty = Type::getInt32Ty (CanIVTy->getContext ());
2305+ OpVPEVL = Builder.createScalarZExtOrTrunc (
2306+ OpVPEVL, CanIVTy, I32Ty, CanonicalIVIncrement->getDebugLoc ());
2307+
23182308 auto *NextEVLIV = Builder.createOverflowingOp (
23192309 Instruction::Add, {OpVPEVL, EVLPhi},
23202310 {CanonicalIVIncrement->hasNoUnsignedWrap (),
0 commit comments