Skip to content

Commit 195677a

Browse files
committed
!fixup update after rebase
1 parent e3db837 commit 195677a

File tree

73 files changed

+764
-1045
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+764
-1045
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2507,7 +2507,8 @@ void InnerLoopVectorizer::introduceCheckBlockInVPlan(BasicBlock *CheckIRBB) {
25072507
auto *ResumePhi = dyn_cast<VPInstruction>(&R);
25082508
if (!ResumePhi || ResumePhi->getOpcode() != VPInstruction::ResumePhi)
25092509
continue;
2510-
ResumePhi->addOperand(ResumePhi->getOperand(1));
2510+
ResumePhi->addOperand(
2511+
ResumePhi->getOperand(ScalarPH->getNumPredecessors() == 1 ? 0 : 1));
25112512
}
25122513
}
25132514

@@ -2676,8 +2677,6 @@ void InnerLoopVectorizer::createVectorLoopSkeleton(StringRef Prefix) {
26762677
LoopScalarPreHeader =
26772678
SplitBlock(LoopVectorPreHeader, LoopVectorPreHeader->getTerminator(), DT,
26782679
LI, nullptr, Twine(Prefix) + "scalar.ph");
2679-
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
2680-
26812680
}
26822681

26832682
/// Return the expanded step for \p ID using \p ExpandedSCEVs to look up SCEV
@@ -2810,6 +2809,7 @@ BasicBlock *InnerLoopVectorizer::createVectorizedLoopSkeleton(
28102809
// faster.
28112810
emitMemRuntimeChecks(LoopScalarPreHeader);
28122811

2812+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
28132813
return LoopVectorPreHeader;
28142814
}
28152815

@@ -7568,10 +7568,11 @@ VectorizationFactor LoopVectorizationPlanner::computeBestVF() {
75687568
// Set PlanForEarlyExitLoop to true if the BestPlan has been built from a
75697569
// loop with an uncountable early exit. The legacy cost model doesn't
75707570
// properly model costs for such loops.
7571+
auto ExitBlocks = BestPlan.getExitBlocks();
75717572
bool PlanForEarlyExitLoop =
7572-
BestPlan.getVectorLoopRegion() &&
7573-
BestPlan.getVectorLoopRegion()->getSingleSuccessor() !=
7574-
BestPlan.getMiddleBlock();
7573+
std::distance(ExitBlocks.begin(), ExitBlocks.end()) > 2 ||
7574+
(std::distance(ExitBlocks.begin(), ExitBlocks.end()) == 1 &&
7575+
(*ExitBlocks.begin())->getNumPredecessors() > 1);
75757576
assert((BestFactor.Width == LegacyVF.Width || PlanForEarlyExitLoop ||
75767577
planContainsAdditionalSimplifications(getPlanFor(BestFactor.Width),
75777578
CostCtx, OrigLoop) ||
@@ -7884,6 +7885,7 @@ BasicBlock *EpilogueVectorizerMainLoop::createEpilogueVectorizedLoopSkeleton(
78847885
// Generate the induction variable.
78857886
EPI.VectorTripCount = getOrCreateVectorTripCount(LoopVectorPreHeader);
78867887

7888+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
78877889
return LoopVectorPreHeader;
78887890
}
78897891

@@ -8038,6 +8040,7 @@ EpilogueVectorizerEpilogueLoop::createEpilogueVectorizedLoopSkeleton(
80388040
// resume value for the induction variable comes from the trip count of the
80398041
// main vector loop, passed as the second argument.
80408042
createInductionAdditionalBypassValues(ExpandedSCEVs, EPI.VectorTripCount);
8043+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
80418044
return LoopVectorPreHeader;
80428045
}
80438046

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1468,40 +1468,45 @@ void VPlanTransforms::truncateToMinimalBitwidths(
14681468
}
14691469

14701470
/// Remove BranchOnCond recipes with constant conditions together with removing
1471-
/// dead edges to their successors. Remove blocks that become dead (no remaining
1472-
/// predecessors())
1471+
/// dead edges to their successors.
14731472
static void simplifyCFG(VPlan &Plan) {
14741473
using namespace llvm::VPlanPatternMatch;
1475-
// Start by collecting successor blocks known to not be taken from
1476-
// branch-on-cond terminator in their predecessor.
1477-
SmallVector<VPBlockBase *> WorkList;
14781474
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
14791475
vp_depth_first_deep(Plan.getEntry()))) {
1480-
VPRecipeBase *Term = VPBB->getTerminator();
1481-
if (!Term || !match(Term, m_BranchOnCond(m_True())))
1476+
if (VPBB->getNumSuccessors() != 2 || VPBB->begin() == VPBB->end() ||
1477+
!match(&VPBB->back(), m_BranchOnCond(m_True())))
14821478
continue;
1483-
VPBasicBlock *DeadSucc = cast<VPBasicBlock>(VPBB->getSuccessors()[1]);
1484-
VPBlockUtils::disconnectBlocks(VPBB, DeadSucc);
1485-
Term->eraseFromParent();
1486-
WorkList.push_back(DeadSucc);
1487-
}
14881479

1489-
VPValue Tmp;
1490-
// Remove any block in the worklist if it doesn't have any predecessors left.
1491-
// Disconnect the block from all successors and queue them for removal.
1492-
while (!WorkList.empty()) {
1493-
VPBlockBase *VPBB = WorkList.pop_back_val();
1494-
if (VPBB->getNumPredecessors() != 0)
1495-
continue;
1496-
for (VPBlockBase *Succ : to_vector(VPBB->getSuccessors())) {
1497-
VPBlockUtils::disconnectBlocks(VPBB, Succ);
1498-
WorkList.push_back(Succ);
1480+
VPBasicBlock *DeadSucc = cast<VPBasicBlock>(VPBB->getSuccessors()[1]);
1481+
const auto &Preds = DeadSucc->getPredecessors();
1482+
unsigned DeadIdx = std::distance(Preds.begin(), find(Preds, VPBB));
1483+
1484+
// Remove values coming from VPBB from phi-like recipes in DeadSucc.
1485+
for (VPRecipeBase &R : make_early_inc_range(*DeadSucc)) {
1486+
assert((!isa<VPIRInstruction>(&R) ||
1487+
!isa<PHINode>(cast<VPIRInstruction>(&R)->getInstruction())) &&
1488+
!isa<VPHeaderPHIRecipe>(&R) &&
1489+
"Cannot update VPIRInstructions wrapping phis or header phis yet");
1490+
auto *VPI = dyn_cast<VPInstruction>(&R);
1491+
if (VPI && VPI->getOpcode() == VPInstruction::ResumePhi) {
1492+
VPBuilder B(VPI);
1493+
SmallVector<VPValue *> NewOps;
1494+
// Create new operand list, with the dead incoming value filtered out.
1495+
for (const auto &[Idx, Op] : enumerate(VPI->operands())) {
1496+
if (Idx == DeadIdx)
1497+
continue;
1498+
NewOps.push_back(Op);
1499+
}
1500+
VPI->replaceAllUsesWith(B.createNaryOp(VPInstruction::ResumePhi, NewOps,
1501+
VPI->getDebugLoc(),
1502+
VPI->getName()));
1503+
VPI->eraseFromParent();
1504+
}
14991505
}
1500-
// Replace all uses of values defined in VPB with a dummy VPValue to
1501-
// facilitate removal. All blocks with remaining uses of the dummy value
1502-
// must be removed by subsequent operation.
1503-
VPBB->dropAllReferences(&Tmp);
1504-
delete VPBB;
1506+
// Disconnect blocks and remove the terminator. DeadSucc will be deleted
1507+
// automatically on VPlan descruction.
1508+
VPBlockUtils::disconnectBlocks(VPBB, DeadSucc);
1509+
VPBB->back().eraseFromParent();
15051510
}
15061511
}
15071512

@@ -1514,11 +1519,11 @@ void VPlanTransforms::optimize(VPlan &Plan) {
15141519
runPass(legalizeAndOptimizeInductions, Plan);
15151520
runPass(removeRedundantExpandSCEVRecipes, Plan);
15161521
runPass(simplifyRecipes, Plan, *Plan.getCanonicalIV()->getScalarType());
1522+
simplifyCFG(Plan);
15171523
runPass(removeDeadRecipes, Plan);
15181524

15191525
runPass(createAndOptimizeReplicateRegions, Plan);
15201526
runPass(mergeBlocksIntoPredecessors, Plan);
1521-
runPass(simplifyCFG,Plan);
15221527
runPass(licm, Plan);
15231528
}
15241529

llvm/test/Transforms/LoopVectorize/AArch64/clamped-trip-count.ll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ define void @clamped_tc_8(ptr nocapture %dst, i32 %n, i64 %val) vscale_range(1,1
1515
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
1616
; CHECK-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
1717
; CHECK-NEXT: [[TMP6:%.*]] = mul i64 [[TMP5]], 8
18-
; CHECK-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 [[N_VEC]]
1918
; CHECK-NEXT: [[ACTIVE_LANE_MASK_ENTRY:%.*]] = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64 0, i64 8)
2019
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i64> poison, i64 [[VAL]], i64 0
2120
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 8 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
@@ -42,10 +41,10 @@ define void @clamped_tc_8(ptr nocapture %dst, i32 %n, i64 %val) vscale_range(1,1
4241
; CHECK-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64 [[INDEX_NEXT]], i64 8)
4342
; CHECK-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
4443
; CHECK: middle.block:
45-
; CHECK-NEXT: br i1 true, label [[FOR_COND_CLEANUP:%.*]], label [[SCALAR_PH]]
44+
; CHECK-NEXT: br label [[FOR_COND_CLEANUP:%.*]]
4645
; CHECK: scalar.ph:
47-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
48-
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY]] ]
46+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
47+
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[DST]], [[ENTRY]] ]
4948
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
5049
; CHECK: for.body:
5150
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
@@ -101,7 +100,6 @@ define void @clamped_tc_max_8(ptr nocapture %dst, i32 %n, i64 %val) vscale_range
101100
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
102101
; CHECK-NEXT: [[TMP5:%.*]] = call i64 @llvm.vscale.i64()
103102
; CHECK-NEXT: [[TMP6:%.*]] = mul i64 [[TMP5]], 8
104-
; CHECK-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 [[N_VEC]]
105103
; CHECK-NEXT: [[ACTIVE_LANE_MASK_ENTRY:%.*]] = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64 0, i64 [[WIDE_TRIP_COUNT]])
106104
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i64> poison, i64 [[VAL]], i64 0
107105
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 8 x i64> [[BROADCAST_SPLATINSERT]], <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
@@ -128,10 +126,10 @@ define void @clamped_tc_max_8(ptr nocapture %dst, i32 %n, i64 %val) vscale_range
128126
; CHECK-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64 [[INDEX_NEXT]], i64 [[WIDE_TRIP_COUNT]])
129127
; CHECK-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
130128
; CHECK: middle.block:
131-
; CHECK-NEXT: br i1 true, label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[SCALAR_PH]]
129+
; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]
132130
; CHECK: scalar.ph:
133-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
134-
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[FOR_BODY_PREHEADER]] ]
131+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ]
132+
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[DST]], [[FOR_BODY_PREHEADER]] ]
135133
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
136134
; CHECK: for.body:
137135
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]

llvm/test/Transforms/LoopVectorize/AArch64/conditional-branches-cost.ll

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -460,17 +460,17 @@ define void @latch_branch_cost(ptr %dst) {
460460
; PRED-NEXT: [[TMP25:%.*]] = icmp eq i64 [[INDEX_NEXT]], 104
461461
; PRED-NEXT: br i1 [[TMP25]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
462462
; PRED: middle.block:
463-
; PRED-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]]
463+
; PRED-NEXT: br label [[EXIT:%.*]]
464464
; PRED: scalar.ph:
465-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 104, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
465+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
466466
; PRED-NEXT: br label [[FOR_BODY:%.*]]
467467
; PRED: loop:
468468
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
469469
; PRED-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV]]
470470
; PRED-NEXT: store i8 0, ptr [[GEP]], align 1
471471
; PRED-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[IV]], 1
472472
; PRED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], 100
473-
; PRED-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
473+
; PRED-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
474474
; PRED: exit:
475475
; PRED-NEXT: ret void
476476
;
@@ -713,9 +713,9 @@ define i32 @header_mask_and_invariant_compare(ptr %A, ptr %B, ptr %C, ptr %D, pt
713713
; PRED-NEXT: [[TMP24:%.*]] = extractelement <4 x i1> [[TMP28]], i32 0
714714
; PRED-NEXT: br i1 [[TMP24]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
715715
; PRED: middle.block:
716-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
716+
; PRED-NEXT: br label [[EXIT:%.*]]
717717
; PRED: scalar.ph:
718-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ]
718+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ]
719719
; PRED-NEXT: br label [[LOOP_HEADER:%.*]]
720720
; PRED: loop.header:
721721
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -821,9 +821,6 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
821821
; PRED-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
822822
; PRED-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
823823
; PRED-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 2
824-
; PRED-NEXT: [[TMP3:%.*]] = mul i64 [[N_VEC]], 8
825-
; PRED-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]]
826-
; PRED-NEXT: [[IND_END1:%.*]] = mul i64 [[N_VEC]], 2
827824
; PRED-NEXT: [[TMP6:%.*]] = call i64 @llvm.vscale.i64()
828825
; PRED-NEXT: [[TMP7:%.*]] = mul i64 [[TMP6]], 2
829826
; PRED-NEXT: [[TMP8:%.*]] = sub i64 257, [[TMP7]]
@@ -850,10 +847,10 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
850847
; PRED-NEXT: [[TMP17:%.*]] = extractelement <vscale x 2 x i1> [[TMP16]], i32 0
851848
; PRED-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
852849
; PRED: middle.block:
853-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
850+
; PRED-NEXT: br label [[EXIT:%.*]]
854851
; PRED: scalar.ph:
855-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
856-
; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ [[IND_END1]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
852+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[DST]], [[ENTRY:%.*]] ]
853+
; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ 0, [[ENTRY]] ]
857854
; PRED-NEXT: br label [[LOOP:%.*]]
858855
; PRED: loop:
859856
; PRED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]
@@ -978,9 +975,9 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
978975
; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
979976
; DEFAULT-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
980977
; DEFAULT: middle.block:
981-
; DEFAULT-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
978+
; DEFAULT-NEXT: br label [[EXIT:%.*]]
982979
; DEFAULT: scalar.ph:
983-
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 8, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
980+
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
984981
; DEFAULT-NEXT: br label [[LOOP:%.*]]
985982
; DEFAULT: loop:
986983
; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -1080,9 +1077,9 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
10801077
; PRED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
10811078
; PRED-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
10821079
; PRED: middle.block:
1083-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1080+
; PRED-NEXT: br label [[EXIT:%.*]]
10841081
; PRED: scalar.ph:
1085-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 8, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1082+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
10861083
; PRED-NEXT: br label [[LOOP:%.*]]
10871084
; PRED: loop:
10881085
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -1517,9 +1514,9 @@ define void @test_conditional_interleave_group (ptr noalias %src.1, ptr noalias
15171514
; PRED-NEXT: [[TMP85:%.*]] = extractelement <8 x i1> [[TMP84]], i32 0
15181515
; PRED-NEXT: br i1 [[TMP85]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
15191516
; PRED: middle.block:
1520-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1517+
; PRED-NEXT: br label [[EXIT:%.*]]
15211518
; PRED: scalar.ph:
1522-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
1519+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
15231520
; PRED-NEXT: br label [[LOOP_HEADER:%.*]]
15241521
; PRED: loop.header:
15251522
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -1630,9 +1627,9 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
16301627
; DEFAULT-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
16311628
; DEFAULT-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
16321629
; DEFAULT: middle.block:
1633-
; DEFAULT-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1630+
; DEFAULT-NEXT: br label [[EXIT:%.*]]
16341631
; DEFAULT: scalar.ph:
1635-
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 24, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1632+
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
16361633
; DEFAULT-NEXT: br label [[LOOP_HEADER:%.*]]
16371634
; DEFAULT: loop.header:
16381635
; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -1693,9 +1690,9 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
16931690
; PRED-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
16941691
; PRED-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
16951692
; PRED: middle.block:
1696-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1693+
; PRED-NEXT: br label [[EXIT:%.*]]
16971694
; PRED: scalar.ph:
1698-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 24, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1695+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
16991696
; PRED-NEXT: br label [[LOOP_HEADER:%.*]]
17001697
; PRED: loop.header:
17011698
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]

llvm/test/Transforms/LoopVectorize/AArch64/divs-with-scalable-vfs.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ define void @sdiv_feeding_gep_predicated(ptr %dst, i32 %x, i64 %M, i64 %conv6, i
160160
; CHECK-NEXT: [[TMP37:%.*]] = extractelement <vscale x 2 x i1> [[TMP36]], i32 0
161161
; CHECK-NEXT: br i1 [[TMP37]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
162162
; CHECK: [[MIDDLE_BLOCK]]:
163-
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
163+
; CHECK-NEXT: br label %[[EXIT:.*]]
164164
; CHECK: [[SCALAR_PH]]:
165-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ]
165+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ]
166166
; CHECK-NEXT: br label %[[LOOP:.*]]
167167
; CHECK: [[LOOP]]:
168168
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
@@ -287,9 +287,9 @@ define void @udiv_urem_feeding_gep(i64 %x, ptr %dst, i64 %N) {
287287
; CHECK-NEXT: [[TMP48:%.*]] = extractelement <vscale x 2 x i1> [[TMP47]], i32 0
288288
; CHECK-NEXT: br i1 [[TMP48]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
289289
; CHECK: [[MIDDLE_BLOCK]]:
290-
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
290+
; CHECK-NEXT: br label %[[EXIT:.*]]
291291
; CHECK: [[SCALAR_PH]]:
292-
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ]
292+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ]
293293
; CHECK-NEXT: br label %[[LOOP:.*]]
294294
; CHECK: [[LOOP]]:
295295
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]

0 commit comments

Comments
 (0)