Skip to content

Commit b39d6f5

Browse files
committed
Don't simplify, just expand in convertToConcreteRecipes
1 parent 6774abe commit b39d6f5

18 files changed

+163
-167
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6909,7 +6909,6 @@ static bool planContainsAdditionalSimplifications(VPlan &Plan,
69096909
};
69106910

69116911
DenseSet<Instruction *> SeenInstrs;
6912-
SmallDenseMap<PHINode *, unsigned> BlendPhis;
69136912
auto Iter = vp_depth_first_deep(Plan.getVectorLoopRegion()->getEntry());
69146913
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(Iter)) {
69156914
for (VPRecipeBase &R : *VPBB) {
@@ -6937,15 +6936,6 @@ static bool planContainsAdditionalSimplifications(VPlan &Plan,
69376936
if (isa<VPPartialReductionRecipe>(&R))
69386937
return true;
69396938

6940-
// VPBlendRecipes are converted to selects and may have been simplified.
6941-
// Keep track of how many selects each phi has been converted to.
6942-
using namespace VPlanPatternMatch;
6943-
if (match(&R, m_VPInstruction<Instruction::Select>(
6944-
m_VPValue(), m_VPValue(), m_VPValue())))
6945-
if (auto *Phi = dyn_cast_if_present<PHINode>(
6946-
R.getVPSingleValue()->getUnderlyingValue()))
6947-
BlendPhis[Phi]++;
6948-
69496939
/// If a VPlan transform folded a recipe to one producing a single-scalar,
69506940
/// but the original instruction wasn't uniform-after-vectorization in the
69516941
/// legacy cost model, the legacy cost overestimates the actual cost.
@@ -6969,12 +6959,6 @@ static bool planContainsAdditionalSimplifications(VPlan &Plan,
69696959
}
69706960
}
69716961

6972-
// If a phi has been simplified then it will have less selects than the number
6973-
// of incoming values.
6974-
for (auto [Phi, NumSelects] : BlendPhis)
6975-
if (NumSelects != Phi->getNumIncomingValues() - 1)
6976-
return true;
6977-
69786962
// Return true if the loop contains any instructions that are not also part of
69796963
// the VPlan or are skipped for VPlan-based cost computations. This indicates
69806964
// that the VPlan contains extra simplifications.

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,6 +2306,10 @@ class LLVM_ABI_FOR_TEST VPBlendRecipe : public VPSingleDefRecipe {
23062306
/// Generate the phi/select nodes.
23072307
void execute(VPTransformState &State) override;
23082308

2309+
/// Return the cost of this VPWidenMemoryRecipe.
2310+
InstructionCost computeCost(ElementCount VF,
2311+
VPCostContext &Ctx) const override;
2312+
23092313
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
23102314
/// Print the recipe.
23112315
void print(raw_ostream &O, const Twine &Indent,

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -924,19 +924,6 @@ InstructionCost VPInstruction::computeCost(ElementCount VF,
924924
return Ctx.TTI.getVectorInstrCost(Instruction::ExtractElement, VecTy,
925925
Ctx.CostKind);
926926
}
927-
case Instruction::Select: {
928-
if (!getUnderlyingValue())
929-
return 0;
930-
// Handle cases where only the first lane is used the same way as the legacy
931-
// cost model.
932-
if (vputils::onlyFirstLaneUsed(this))
933-
return Ctx.TTI.getCFInstrCost(Instruction::PHI, Ctx.CostKind);
934-
Type *ResTy = toVectorTy(Ctx.Types.inferScalarType(this), VF);
935-
Type *CmpTy = toVectorTy(Type::getInt1Ty(Ctx.Types.getContext()), VF);
936-
return Ctx.TTI.getCmpSelInstrCost(Instruction::Select, ResTy, CmpTy,
937-
CmpInst::BAD_ICMP_PREDICATE,
938-
Ctx.CostKind);
939-
}
940927
case VPInstruction::AnyOf: {
941928
auto *VecTy = toVectorTy(Ctx.Types.inferScalarType(this), VF);
942929
return Ctx.TTI.getArithmeticReductionCost(
@@ -2414,6 +2401,20 @@ void VPBlendRecipe::execute(VPTransformState &State) {
24142401
llvm_unreachable("VPBlendRecipe should be expanded by simplifyBlends");
24152402
}
24162403

2404+
InstructionCost VPBlendRecipe::computeCost(ElementCount VF,
2405+
VPCostContext &Ctx) const {
2406+
// Handle cases where only the first lane is used the same way as the legacy
2407+
// cost model.
2408+
if (vputils::onlyFirstLaneUsed(this))
2409+
return Ctx.TTI.getCFInstrCost(Instruction::PHI, Ctx.CostKind);
2410+
2411+
Type *ResultTy = toVectorTy(Ctx.Types.inferScalarType(this), VF);
2412+
Type *CmpTy = toVectorTy(Type::getInt1Ty(Ctx.Types.getContext()), VF);
2413+
return (getNumIncomingValues() - 1) *
2414+
Ctx.TTI.getCmpSelInstrCost(Instruction::Select, ResultTy, CmpTy,
2415+
CmpInst::BAD_ICMP_PREDICATE, Ctx.CostKind);
2416+
}
2417+
24172418
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
24182419
void VPBlendRecipe::print(raw_ostream &O, const Twine &Indent,
24192420
VPSlotTracker &SlotTracker) const {

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,17 +1297,38 @@ static void simplifyBlends(VPlan &Plan) {
12971297
}
12981298
}
12991299

1300-
VPBuilder Builder(&R);
1301-
VPValue *Select = Blend->getIncomingValue(StartIndex);
1300+
SmallVector<VPValue *, 4> OperandsWithMask;
1301+
OperandsWithMask.push_back(Blend->getIncomingValue(StartIndex));
1302+
13021303
for (unsigned I = 0; I != Blend->getNumIncomingValues(); ++I) {
13031304
if (I == StartIndex)
13041305
continue;
1305-
Select =
1306-
Builder.createSelect(Blend->getMask(I), Blend->getIncomingValue(I),
1307-
Select, R.getDebugLoc(), "predphi");
1308-
Select->setUnderlyingValue(Blend->getUnderlyingValue());
1306+
OperandsWithMask.push_back(Blend->getIncomingValue(I));
1307+
OperandsWithMask.push_back(Blend->getMask(I));
1308+
}
1309+
1310+
auto *NewBlend = new VPBlendRecipe(
1311+
cast<PHINode>(Blend->getUnderlyingValue()), OperandsWithMask);
1312+
NewBlend->insertBefore(&R);
1313+
1314+
VPValue *DeadMask = Blend->getMask(StartIndex);
1315+
Blend->replaceAllUsesWith(NewBlend);
1316+
Blend->eraseFromParent();
1317+
recursivelyDeleteDeadRecipes(DeadMask);
1318+
1319+
/// Simplify BLEND %a, %b, Not(%mask) -> BLEND %b, %a, %mask.
1320+
VPValue *NewMask;
1321+
if (NewBlend->getNumOperands() == 3 &&
1322+
match(NewBlend->getMask(1), m_Not(m_VPValue(NewMask)))) {
1323+
VPValue *Inc0 = NewBlend->getOperand(0);
1324+
VPValue *Inc1 = NewBlend->getOperand(1);
1325+
VPValue *OldMask = NewBlend->getOperand(2);
1326+
NewBlend->setOperand(0, Inc1);
1327+
NewBlend->setOperand(1, Inc0);
1328+
NewBlend->setOperand(2, NewMask);
1329+
if (OldMask->getNumUsers() == 0)
1330+
cast<VPInstruction>(OldMask)->eraseFromParent();
13091331
}
1310-
Blend->replaceAllUsesWith(Select);
13111332
}
13121333
}
13131334
}
@@ -2690,6 +2711,20 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan,
26902711
continue;
26912712
}
26922713

2714+
// Expand VPBlendRecipe into VPInstruction::Select
2715+
VPBuilder Builder(&R);
2716+
if (auto *Blend = dyn_cast<VPBlendRecipe>(&R)) {
2717+
VPValue *Select = Blend->getIncomingValue(0);
2718+
for (unsigned I = 1; I != Blend->getNumIncomingValues(); ++I) {
2719+
Select = Builder.createSelect(Blend->getMask(I),
2720+
Blend->getIncomingValue(I), Select,
2721+
R.getDebugLoc(), "predphi");
2722+
Select->setUnderlyingValue(Blend->getUnderlyingValue());
2723+
}
2724+
Blend->replaceAllUsesWith(Select);
2725+
ToRemove.push_back(Blend);
2726+
}
2727+
26932728
if (auto *Expr = dyn_cast<VPExpressionRecipe>(&R)) {
26942729
Expr->decompose();
26952730
ToRemove.push_back(Expr);
@@ -2703,7 +2738,6 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan,
27032738

27042739
// Expand WideIVStep.
27052740
auto *VPI = cast<VPInstruction>(&R);
2706-
VPBuilder Builder(VPI);
27072741
Type *IVTy = TypeInfo.inferScalarType(VPI);
27082742
if (TypeInfo.inferScalarType(VectorStep) != IVTy) {
27092743
Instruction::CastOps CastOp = IVTy->isFloatingPointTy()

llvm/test/Transforms/LoopVectorize/AArch64/masked-call-scalarize.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {
2222
; TFNONE-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x double> poison, double [[TMP7]], i64 0
2323
; TFNONE-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x double> [[BROADCAST_SPLATINSERT]], <2 x double> poison, <2 x i32> zeroinitializer
2424
; TFNONE-NEXT: [[TMP2:%.*]] = call <2 x double> @exp_fixed(<2 x double> [[BROADCAST_SPLAT]])
25-
; TFNONE-NEXT: [[TMP3:%.*]] = fcmp ule <2 x double> [[TMP2]], zeroinitializer
26-
; TFNONE-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x double> splat (double 1.000000e+00), <2 x double> zeroinitializer
25+
; TFNONE-NEXT: [[TMP3:%.*]] = fcmp ogt <2 x double> [[TMP2]], zeroinitializer
26+
; TFNONE-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x double> zeroinitializer, <2 x double> splat (double 1.000000e+00)
2727
; TFNONE-NEXT: [[TMP14:%.*]] = extractelement <2 x double> [[PREDPHI]], i32 1
2828
; TFNONE-NEXT: store double [[TMP14]], ptr [[P:%.*]], align 8
2929
; TFNONE-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2

llvm/test/Transforms/LoopVectorize/AArch64/masked-call.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -935,8 +935,8 @@ define void @test_widen_exp_v2(ptr noalias %p2, ptr noalias %p, i64 %n) #5 {
935935
; TFNONE-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x double> poison, double [[TMP7]], i64 0
936936
; TFNONE-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x double> [[BROADCAST_SPLATINSERT]], <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
937937
; TFNONE-NEXT: [[TMP8:%.*]] = call <vscale x 2 x double> @exp_masked_scalable(<vscale x 2 x double> [[BROADCAST_SPLAT]], <vscale x 2 x i1> splat (i1 true))
938-
; TFNONE-NEXT: [[TMP9:%.*]] = fcmp ule <vscale x 2 x double> [[TMP8]], zeroinitializer
939-
; TFNONE-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x double> splat (double 1.000000e+00), <vscale x 2 x double> zeroinitializer
938+
; TFNONE-NEXT: [[TMP9:%.*]] = fcmp ogt <vscale x 2 x double> [[TMP8]], zeroinitializer
939+
; TFNONE-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x double> zeroinitializer, <vscale x 2 x double> splat (double 1.000000e+00)
940940
; TFNONE-NEXT: [[TMP11:%.*]] = call i32 @llvm.vscale.i32()
941941
; TFNONE-NEXT: [[TMP12:%.*]] = mul nuw i32 [[TMP11]], 2
942942
; TFNONE-NEXT: [[TMP13:%.*]] = sub i32 [[TMP12]], 1

llvm/test/Transforms/LoopVectorize/RISCV/blend-simplified.ll

Lines changed: 0 additions & 81 deletions
This file was deleted.

llvm/test/Transforms/LoopVectorize/RISCV/blocks-with-dead-instructions.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,8 +597,8 @@ define void @empty_block_with_phi_1(ptr %src, i64 %N) #0 {
597597
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i16, ptr [[SRC]], i64 [[TMP9]]
598598
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr i16, ptr [[TMP10]], i32 0
599599
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 8 x i16>, ptr [[TMP11]], align 2
600-
; CHECK-NEXT: [[TMP8:%.*]] = icmp ne <vscale x 8 x i16> [[WIDE_LOAD]], zeroinitializer
601-
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 8 x i1> [[TMP8]], <vscale x 8 x i16> [[WIDE_LOAD]], <vscale x 8 x i16> splat (i16 99)
600+
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq <vscale x 8 x i16> [[WIDE_LOAD]], zeroinitializer
601+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 8 x i1> [[TMP12]], <vscale x 8 x i16> splat (i16 99), <vscale x 8 x i16> [[WIDE_LOAD]]
602602
; CHECK-NEXT: store <vscale x 8 x i16> [[PREDPHI]], ptr [[TMP11]], align 2
603603
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[TMP9]], [[TMP5]]
604604
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]

llvm/test/Transforms/LoopVectorize/RISCV/divrem.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -677,9 +677,9 @@ define void @predicated_udiv_by_constant(ptr noalias nocapture %a, i64 %n) {
677677
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[INDEX]]
678678
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[TMP7]], i32 0
679679
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 2 x i64>, ptr [[TMP8]], align 8
680-
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 42)
680+
; CHECK-NEXT: [[TMP9:%.*]] = icmp ne <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 42)
681681
; CHECK-NEXT: [[TMP10:%.*]] = udiv <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 27)
682-
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x i64> [[WIDE_LOAD]], <vscale x 2 x i64> [[TMP10]]
682+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x i64> [[TMP10]], <vscale x 2 x i64> [[WIDE_LOAD]]
683683
; CHECK-NEXT: store <vscale x 2 x i64> [[PREDPHI]], ptr [[TMP8]], align 8
684684
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
685685
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
@@ -720,12 +720,12 @@ define void @predicated_udiv_by_constant(ptr noalias nocapture %a, i64 %n) {
720720
; FIXED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 4
721721
; FIXED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP2]], align 8
722722
; FIXED-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP3]], align 8
723-
; FIXED-NEXT: [[TMP5:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD]], splat (i64 42)
724-
; FIXED-NEXT: [[TMP4:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD1]], splat (i64 42)
723+
; FIXED-NEXT: [[TMP4:%.*]] = icmp ne <4 x i64> [[WIDE_LOAD]], splat (i64 42)
724+
; FIXED-NEXT: [[TMP5:%.*]] = icmp ne <4 x i64> [[WIDE_LOAD1]], splat (i64 42)
725725
; FIXED-NEXT: [[TMP6:%.*]] = udiv <4 x i64> [[WIDE_LOAD]], splat (i64 27)
726726
; FIXED-NEXT: [[TMP7:%.*]] = udiv <4 x i64> [[WIDE_LOAD1]], splat (i64 27)
727-
; FIXED-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP5]], <4 x i64> [[WIDE_LOAD]], <4 x i64> [[TMP6]]
728-
; FIXED-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP4]], <4 x i64> [[WIDE_LOAD1]], <4 x i64> [[TMP7]]
727+
; FIXED-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i64> [[TMP6]], <4 x i64> [[WIDE_LOAD]]
728+
; FIXED-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP5]], <4 x i64> [[TMP7]], <4 x i64> [[WIDE_LOAD1]]
729729
; FIXED-NEXT: store <4 x i64> [[PREDPHI]], ptr [[TMP2]], align 8
730730
; FIXED-NEXT: store <4 x i64> [[PREDPHI2]], ptr [[TMP3]], align 8
731731
; FIXED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
@@ -797,9 +797,9 @@ define void @predicated_sdiv_by_constant(ptr noalias nocapture %a, i64 %n) {
797797
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[INDEX]]
798798
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[TMP7]], i32 0
799799
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 2 x i64>, ptr [[TMP8]], align 8
800-
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 42)
800+
; CHECK-NEXT: [[TMP9:%.*]] = icmp ne <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 42)
801801
; CHECK-NEXT: [[TMP10:%.*]] = sdiv <vscale x 2 x i64> [[WIDE_LOAD]], splat (i64 27)
802-
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x i64> [[WIDE_LOAD]], <vscale x 2 x i64> [[TMP10]]
802+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <vscale x 2 x i1> [[TMP9]], <vscale x 2 x i64> [[TMP10]], <vscale x 2 x i64> [[WIDE_LOAD]]
803803
; CHECK-NEXT: store <vscale x 2 x i64> [[PREDPHI]], ptr [[TMP8]], align 8
804804
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
805805
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
@@ -840,12 +840,12 @@ define void @predicated_sdiv_by_constant(ptr noalias nocapture %a, i64 %n) {
840840
; FIXED-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 4
841841
; FIXED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP2]], align 8
842842
; FIXED-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP3]], align 8
843-
; FIXED-NEXT: [[TMP5:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD]], splat (i64 42)
844-
; FIXED-NEXT: [[TMP4:%.*]] = icmp eq <4 x i64> [[WIDE_LOAD1]], splat (i64 42)
843+
; FIXED-NEXT: [[TMP4:%.*]] = icmp ne <4 x i64> [[WIDE_LOAD]], splat (i64 42)
844+
; FIXED-NEXT: [[TMP5:%.*]] = icmp ne <4 x i64> [[WIDE_LOAD1]], splat (i64 42)
845845
; FIXED-NEXT: [[TMP6:%.*]] = sdiv <4 x i64> [[WIDE_LOAD]], splat (i64 27)
846846
; FIXED-NEXT: [[TMP7:%.*]] = sdiv <4 x i64> [[WIDE_LOAD1]], splat (i64 27)
847-
; FIXED-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP5]], <4 x i64> [[WIDE_LOAD]], <4 x i64> [[TMP6]]
848-
; FIXED-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP4]], <4 x i64> [[WIDE_LOAD1]], <4 x i64> [[TMP7]]
847+
; FIXED-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP4]], <4 x i64> [[TMP6]], <4 x i64> [[WIDE_LOAD]]
848+
; FIXED-NEXT: [[PREDPHI2:%.*]] = select <4 x i1> [[TMP5]], <4 x i64> [[TMP7]], <4 x i64> [[WIDE_LOAD1]]
849849
; FIXED-NEXT: store <4 x i64> [[PREDPHI]], ptr [[TMP2]], align 8
850850
; FIXED-NEXT: store <4 x i64> [[PREDPHI2]], ptr [[TMP3]], align 8
851851
; FIXED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8

0 commit comments

Comments
 (0)