Skip to content

Commit 688dc38

Browse files
committed
!fixup update after rebase
1 parent 332205c commit 688dc38

File tree

73 files changed

+774
-1043
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

+774
-1043
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2514,7 +2514,8 @@ void InnerLoopVectorizer::introduceCheckBlockInVPlan(BasicBlock *CheckIRBB) {
25142514
auto *ResumePhi = dyn_cast<VPInstruction>(&R);
25152515
if (!ResumePhi || ResumePhi->getOpcode() != VPInstruction::ResumePhi)
25162516
continue;
2517-
ResumePhi->addOperand(ResumePhi->getOperand(1));
2517+
ResumePhi->addOperand(
2518+
ResumePhi->getOperand(ScalarPH->getNumPredecessors() == 1 ? 0 : 1));
25182519
}
25192520
}
25202521

@@ -2684,8 +2685,6 @@ void InnerLoopVectorizer::createVectorLoopSkeleton(StringRef Prefix) {
26842685
LoopScalarPreHeader =
26852686
SplitBlock(LoopVectorPreHeader, LoopVectorPreHeader->getTerminator(), DT,
26862687
LI, nullptr, Twine(Prefix) + "scalar.ph");
2687-
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
2688-
26892688
}
26902689

26912690
/// Return the expanded step for \p ID using \p ExpandedSCEVs to look up SCEV
@@ -2818,6 +2817,7 @@ BasicBlock *InnerLoopVectorizer::createVectorizedLoopSkeleton(
28182817
// faster.
28192818
emitMemRuntimeChecks(LoopScalarPreHeader);
28202819

2820+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
28212821
return LoopVectorPreHeader;
28222822
}
28232823

@@ -7559,10 +7559,11 @@ VectorizationFactor LoopVectorizationPlanner::computeBestVF() {
75597559
// Set PlanForEarlyExitLoop to true if the BestPlan has been built from a
75607560
// loop with an uncountable early exit. The legacy cost model doesn't
75617561
// properly model costs for such loops.
7562+
auto ExitBlocks = BestPlan.getExitBlocks();
75627563
bool PlanForEarlyExitLoop =
7563-
BestPlan.getVectorLoopRegion() &&
7564-
BestPlan.getVectorLoopRegion()->getSingleSuccessor() !=
7565-
BestPlan.getMiddleBlock();
7564+
std::distance(ExitBlocks.begin(), ExitBlocks.end()) > 2 ||
7565+
(std::distance(ExitBlocks.begin(), ExitBlocks.end()) == 1 &&
7566+
(*ExitBlocks.begin())->getNumPredecessors() > 1);
75667567
assert((BestFactor.Width == LegacyVF.Width || PlanForEarlyExitLoop ||
75677568
planContainsAdditionalSimplifications(getPlanFor(BestFactor.Width),
75687569
CostCtx, OrigLoop) ||
@@ -7875,6 +7876,7 @@ BasicBlock *EpilogueVectorizerMainLoop::createEpilogueVectorizedLoopSkeleton(
78757876
// Generate the induction variable.
78767877
EPI.VectorTripCount = getOrCreateVectorTripCount(LoopVectorPreHeader);
78777878

7879+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
78787880
return LoopVectorPreHeader;
78797881
}
78807882

@@ -8029,6 +8031,7 @@ EpilogueVectorizerEpilogueLoop::createEpilogueVectorizedLoopSkeleton(
80298031
// resume value for the induction variable comes from the trip count of the
80308032
// main vector loop, passed as the second argument.
80318033
createInductionAdditionalBypassValues(ExpandedSCEVs, EPI.VectorTripCount);
8034+
replaceVPBBWithIRVPBB(Plan.getScalarPreheader(), LoopScalarPreHeader);
80328035
return LoopVectorPreHeader;
80338036
}
80348037

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

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

14401440
/// Remove BranchOnCond recipes with constant conditions together with removing
1441-
/// dead edges to their successors. Remove blocks that become dead (no remaining
1442-
/// predecessors())
1441+
/// dead edges to their successors.
14431442
static void simplifyCFG(VPlan &Plan) {
14441443
using namespace llvm::VPlanPatternMatch;
1445-
// Start by collecting successor blocks known to not be taken from
1446-
// branch-on-cond terminator in their predecessor.
1447-
SmallVector<VPBlockBase *> WorkList;
14481444
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
14491445
vp_depth_first_deep(Plan.getEntry()))) {
1450-
VPRecipeBase *Term = VPBB->getTerminator();
1451-
if (!Term || !match(Term, m_BranchOnCond(m_True())))
1446+
if (VPBB->getNumSuccessors() != 2 || VPBB->begin() == VPBB->end() ||
1447+
!match(&VPBB->back(), m_BranchOnCond(m_True())))
14521448
continue;
1453-
VPBasicBlock *DeadSucc = cast<VPBasicBlock>(VPBB->getSuccessors()[1]);
1454-
VPBlockUtils::disconnectBlocks(VPBB, DeadSucc);
1455-
Term->eraseFromParent();
1456-
WorkList.push_back(DeadSucc);
1457-
}
14581449

1459-
VPValue Tmp;
1460-
// Remove any block in the worklist if it doesn't have any predecessors left.
1461-
// Disconnect the block from all successors and queue them for removal.
1462-
while (!WorkList.empty()) {
1463-
VPBlockBase *VPBB = WorkList.pop_back_val();
1464-
if (VPBB->getNumPredecessors() != 0)
1465-
continue;
1466-
for (VPBlockBase *Succ : to_vector(VPBB->getSuccessors())) {
1467-
VPBlockUtils::disconnectBlocks(VPBB, Succ);
1468-
WorkList.push_back(Succ);
1450+
VPBasicBlock *DeadSucc = cast<VPBasicBlock>(VPBB->getSuccessors()[1]);
1451+
const auto &Preds = DeadSucc->getPredecessors();
1452+
unsigned DeadIdx = std::distance(Preds.begin(), find(Preds, VPBB));
1453+
1454+
// Remove values coming from VPBB from phi-like recipes in DeadSucc.
1455+
for (VPRecipeBase &R : make_early_inc_range(*DeadSucc)) {
1456+
assert((!isa<VPIRInstruction>(&R) ||
1457+
!isa<PHINode>(cast<VPIRInstruction>(&R)->getInstruction())) &&
1458+
!isa<VPHeaderPHIRecipe>(&R) &&
1459+
"Cannot update VPIRInstructions wrapping phis or header phis yet");
1460+
auto *VPI = dyn_cast<VPInstruction>(&R);
1461+
if (VPI && VPI->getOpcode() == VPInstruction::ResumePhi) {
1462+
VPBuilder B(VPI);
1463+
SmallVector<VPValue *> NewOps;
1464+
// Create new operand list, with the dead incoming value filtered out.
1465+
for (const auto &[Idx, Op] : enumerate(VPI->operands())) {
1466+
if (Idx == DeadIdx)
1467+
continue;
1468+
NewOps.push_back(Op);
1469+
}
1470+
VPI->replaceAllUsesWith(B.createNaryOp(VPInstruction::ResumePhi, NewOps,
1471+
VPI->getDebugLoc(),
1472+
VPI->getName()));
1473+
VPI->eraseFromParent();
1474+
}
14691475
}
1470-
// Replace all uses of values defined in VPB with a dummy VPValue to
1471-
// facilitate removal. All blocks with remaining uses of the dummy value
1472-
// must be removed by subsequent operation.
1473-
VPBB->dropAllReferences(&Tmp);
1474-
delete VPBB;
1476+
// Disconnect blocks and remove the terminator. DeadSucc will be deleted
1477+
// automatically on VPlan descruction.
1478+
VPBlockUtils::disconnectBlocks(VPBB, DeadSucc);
1479+
VPBB->back().eraseFromParent();
14751480
}
14761481
}
14771482

@@ -1484,11 +1489,11 @@ void VPlanTransforms::optimize(VPlan &Plan) {
14841489
runPass(legalizeAndOptimizeInductions, Plan);
14851490
runPass(removeRedundantExpandSCEVRecipes, Plan);
14861491
runPass(simplifyRecipes, Plan, *Plan.getCanonicalIV()->getScalarType());
1492+
simplifyCFG(Plan);
14871493
runPass(removeDeadRecipes, Plan);
14881494

14891495
runPass(createAndOptimizeReplicateRegions, Plan);
14901496
runPass(mergeBlocksIntoPredecessors, Plan);
1491-
runPass(simplifyCFG,Plan);
14921497
runPass(licm, Plan);
14931498
}
14941499

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: [[TMP8:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
2120
; CHECK-NEXT: [[TMP7:%.*]] = mul <vscale x 8 x i64> [[TMP8]], splat (i64 1)
@@ -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: [[TMP8:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
107105
; CHECK-NEXT: [[TMP7:%.*]] = mul <vscale x 8 x i64> [[TMP8]], splat (i64 1)
@@ -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:%.*]] ]
@@ -823,9 +823,6 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
823823
; PRED-NEXT: [[N_VEC:%.*]] = sub i64 [[N_RND_UP]], [[N_MOD_VF]]
824824
; PRED-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
825825
; PRED-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 2
826-
; PRED-NEXT: [[TMP3:%.*]] = mul i64 [[N_VEC]], 8
827-
; PRED-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]]
828-
; PRED-NEXT: [[IND_END1:%.*]] = mul i64 [[N_VEC]], 2
829826
; PRED-NEXT: [[TMP6:%.*]] = call i64 @llvm.vscale.i64()
830827
; PRED-NEXT: [[TMP7:%.*]] = mul i64 [[TMP6]], 2
831828
; PRED-NEXT: [[TMP8:%.*]] = sub i64 257, [[TMP7]]
@@ -852,10 +849,10 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
852849
; PRED-NEXT: [[TMP17:%.*]] = extractelement <vscale x 2 x i1> [[TMP16]], i32 0
853850
; PRED-NEXT: br i1 [[TMP17]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
854851
; PRED: middle.block:
855-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
852+
; PRED-NEXT: br label [[EXIT:%.*]]
856853
; PRED: scalar.ph:
857-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
858-
; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ [[IND_END1]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
854+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[DST]], [[ENTRY:%.*]] ]
855+
; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ 0, [[ENTRY]] ]
859856
; PRED-NEXT: br label [[LOOP:%.*]]
860857
; PRED: vector.scevcheck:
861858
; PRED-NEXT: unreachable
@@ -982,9 +979,9 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
982979
; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
983980
; DEFAULT-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP24:![0-9]+]]
984981
; DEFAULT: middle.block:
985-
; DEFAULT-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
982+
; DEFAULT-NEXT: br label [[EXIT:%.*]]
986983
; DEFAULT: scalar.ph:
987-
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 8, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
984+
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
988985
; DEFAULT-NEXT: br label [[LOOP:%.*]]
989986
; DEFAULT: loop:
990987
; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -1084,9 +1081,9 @@ define void @low_trip_count_fold_tail_scalarized_store(ptr %dst) {
10841081
; PRED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
10851082
; PRED-NEXT: br i1 true, label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP21:![0-9]+]]
10861083
; PRED: middle.block:
1087-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1084+
; PRED-NEXT: br label [[EXIT:%.*]]
10881085
; PRED: scalar.ph:
1089-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 8, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1086+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
10901087
; PRED-NEXT: br label [[LOOP:%.*]]
10911088
; PRED: loop:
10921089
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -1521,9 +1518,9 @@ define void @test_conditional_interleave_group (ptr noalias %src.1, ptr noalias
15211518
; PRED-NEXT: [[TMP85:%.*]] = extractelement <8 x i1> [[TMP84]], i32 0
15221519
; PRED-NEXT: br i1 [[TMP85]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP23:![0-9]+]]
15231520
; PRED: middle.block:
1524-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1521+
; PRED-NEXT: br label [[EXIT:%.*]]
15251522
; PRED: scalar.ph:
1526-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
1523+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ]
15271524
; PRED-NEXT: br label [[LOOP_HEADER:%.*]]
15281525
; PRED: loop.header:
15291526
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -1634,9 +1631,9 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
16341631
; DEFAULT-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
16351632
; DEFAULT-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
16361633
; DEFAULT: middle.block:
1637-
; DEFAULT-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1634+
; DEFAULT-NEXT: br label [[EXIT:%.*]]
16381635
; DEFAULT: scalar.ph:
1639-
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 24, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1636+
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
16401637
; DEFAULT-NEXT: br label [[LOOP_HEADER:%.*]]
16411638
; DEFAULT: loop.header:
16421639
; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -1697,9 +1694,9 @@ define void @redundant_branch_and_tail_folding(ptr %dst, i1 %c) optsize {
16971694
; PRED-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 24
16981695
; PRED-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP25:![0-9]+]]
16991696
; PRED: middle.block:
1700-
; PRED-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1697+
; PRED-NEXT: br label [[EXIT:%.*]]
17011698
; PRED: scalar.ph:
1702-
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 24, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
1699+
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ]
17031700
; PRED-NEXT: br label [[LOOP_HEADER:%.*]]
17041701
; PRED: loop.header:
17051702
; 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)