Skip to content

Commit 4a2e82f

Browse files
fhahngithub-actions[bot]
authored andcommitted
Automerge: [VPlan] Connect Entry to scalar preheader during initial construction. (#140132)
Update initial construction to connect the Plan's entry to the scalar preheader during initial construction. This moves a small part of the skeleton creation out of ILV and will also enable replacing VPInstruction::ResumePhi with regular VPPhi recipes. Resume phis need 2 incoming values to start with, the second being the bypass value from the scalar ph (and used to replicate the incoming value for other bypass blocks). Adding the extra edge ensures we incoming values for resume phis match the incoming blocks. PR: llvm/llvm-project#140132
2 parents cfe2a76 + d56deea commit 4a2e82f

30 files changed

+332
-339
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ class InnerLoopVectorizer {
490490
MinProfitableTripCount(MinProfitableTripCount), UF(UnrollFactor),
491491
Builder(PSE.getSE()->getContext()), Cost(CM), BFI(BFI), PSI(PSI),
492492
RTChecks(RTChecks), Plan(Plan),
493-
VectorPHVPB(Plan.getEntry()->getSingleSuccessor()) {}
493+
VectorPHVPB(Plan.getVectorLoopRegion()->getSinglePredecessor()) {}
494494

495495
virtual ~InnerLoopVectorizer() = default;
496496

@@ -2366,16 +2366,15 @@ InnerLoopVectorizer::getOrCreateVectorTripCount(BasicBlock *InsertBlock) {
23662366
}
23672367

23682368
void InnerLoopVectorizer::introduceCheckBlockInVPlan(BasicBlock *CheckIRBB) {
2369+
// Note: The block with the minimum trip-count check is already connected
2370+
// during earlier VPlan construction.
23692371
VPBlockBase *ScalarPH = Plan.getScalarPreheader();
23702372
VPBlockBase *PreVectorPH = VectorPHVPB->getSinglePredecessor();
2371-
if (PreVectorPH->getNumSuccessors() != 1) {
2372-
assert(PreVectorPH->getNumSuccessors() == 2 && "Expected 2 successors");
2373-
assert(PreVectorPH->getSuccessors()[0] == ScalarPH &&
2374-
"Unexpected successor");
2375-
VPIRBasicBlock *CheckVPIRBB = Plan.createVPIRBasicBlock(CheckIRBB);
2376-
VPBlockUtils::insertOnEdge(PreVectorPH, VectorPHVPB, CheckVPIRBB);
2377-
PreVectorPH = CheckVPIRBB;
2378-
}
2373+
assert(PreVectorPH->getNumSuccessors() == 2 && "Expected 2 successors");
2374+
assert(PreVectorPH->getSuccessors()[0] == ScalarPH && "Unexpected successor");
2375+
VPIRBasicBlock *CheckVPIRBB = Plan.createVPIRBasicBlock(CheckIRBB);
2376+
VPBlockUtils::insertOnEdge(PreVectorPH, VectorPHVPB, CheckVPIRBB);
2377+
PreVectorPH = CheckVPIRBB;
23792378
VPBlockUtils::connectBlocks(PreVectorPH, ScalarPH);
23802379
PreVectorPH->swapSuccessors();
23812380

@@ -2467,8 +2466,9 @@ void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
24672466
ReplaceInstWithInst(TCCheckBlock->getTerminator(), &BI);
24682467
LoopBypassBlocks.push_back(TCCheckBlock);
24692468

2470-
// TODO: Wrap LoopVectorPreHeader in VPIRBasicBlock here.
2471-
introduceCheckBlockInVPlan(TCCheckBlock);
2469+
assert(cast<VPIRBasicBlock>(Plan.getEntry())->getIRBasicBlock() ==
2470+
TCCheckBlock &&
2471+
"Plan's entry must be TCCCheckBlock");
24722472
}
24732473

24742474
BasicBlock *InnerLoopVectorizer::emitSCEVChecks(BasicBlock *Bypass) {
@@ -7667,7 +7667,7 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
76677667

76687668
// 1. Set up the skeleton for vectorization, including vector pre-header and
76697669
// middle block. The vector loop is created during VPlan execution.
7670-
VPBasicBlock *VectorPH = cast<VPBasicBlock>(Entry->getSingleSuccessor());
7670+
VPBasicBlock *VectorPH = cast<VPBasicBlock>(Entry->getSuccessors()[1]);
76717671
State.CFG.PrevBB = ILV.createVectorizedLoopSkeleton();
76727672
if (VectorizingEpilogue)
76737673
VPlanTransforms::removeDeadRecipes(BestVPlan);
@@ -7899,7 +7899,12 @@ EpilogueVectorizerMainLoop::emitIterationCountCheck(BasicBlock *Bypass,
78997899
setBranchWeights(BI, MinItersBypassWeights, /*IsExpected=*/false);
79007900
ReplaceInstWithInst(TCCheckBlock->getTerminator(), &BI);
79017901

7902-
introduceCheckBlockInVPlan(TCCheckBlock);
7902+
// When vectorizing the main loop, its trip-count check is placed in a new
7903+
// block, whereas the overall trip-count check is placed in the VPlan entry
7904+
// block. When vectorizing the epilogue loop, its trip-count check is placed
7905+
// in the VPlan entry block.
7906+
if (!ForEpilogue)
7907+
introduceCheckBlockInVPlan(TCCheckBlock);
79037908
return TCCheckBlock;
79047909
}
79057910

@@ -8029,7 +8034,6 @@ EpilogueVectorizerEpilogueLoop::emitMinimumVectorEpilogueIterCountCheck(
80298034
Plan.setEntry(NewEntry);
80308035
// OldEntry is now dead and will be cleaned up when the plan gets destroyed.
80318036

8032-
introduceCheckBlockInVPlan(Insert);
80338037
return Insert;
80348038
}
80358039

@@ -8786,7 +8790,7 @@ static void addScalarResumePhis(VPRecipeBuilder &Builder, VPlan &Plan,
87868790
DenseMap<VPValue *, VPValue *> &IVEndValues) {
87878791
VPTypeAnalysis TypeInfo(Plan.getCanonicalIV()->getScalarType());
87888792
auto *ScalarPH = Plan.getScalarPreheader();
8789-
auto *MiddleVPBB = cast<VPBasicBlock>(ScalarPH->getSinglePredecessor());
8793+
auto *MiddleVPBB = cast<VPBasicBlock>(ScalarPH->getPredecessors()[0]);
87908794
VPRegionBlock *VectorRegion = Plan.getVectorLoopRegion();
87918795
VPBuilder VectorPHBuilder(
87928796
cast<VPBasicBlock>(VectorRegion->getSinglePredecessor()));

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4221,7 +4221,8 @@ class VPlan {
42214221
/// that this relies on unneeded branches to the scalar tail loop being
42224222
/// removed.
42234223
bool hasScalarTail() const {
4224-
return getScalarPreheader()->getNumPredecessors() != 0;
4224+
return !(getScalarPreheader()->getNumPredecessors() == 0 ||
4225+
getScalarPreheader()->getSinglePredecessor() == getEntry());
42254226
}
42264227
};
42274228

llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,9 @@ void VPlanTransforms::prepareForVectorization(
540540
if (auto *LatchExitVPB = MiddleVPBB->getSingleSuccessor())
541541
VPBlockUtils::disconnectBlocks(MiddleVPBB, LatchExitVPB);
542542
VPBlockUtils::connectBlocks(MiddleVPBB, ScalarPH);
543+
VPBlockUtils::connectBlocks(Plan.getEntry(), ScalarPH);
544+
Plan.getEntry()->swapSuccessors();
545+
543546
// The exit blocks are unreachable, remove their recipes to make sure no
544547
// users remain that may pessimize transforms.
545548
for (auto *EB : Plan.getExitBlocks()) {
@@ -552,6 +555,11 @@ void VPlanTransforms::prepareForVectorization(
552555
// The connection order corresponds to the operands of the conditional branch,
553556
// with the middle block already connected to the exit block.
554557
VPBlockUtils::connectBlocks(MiddleVPBB, ScalarPH);
558+
// Also connect the entry block to the scalar preheader.
559+
// TODO: Also introduce a branch recipe together with the minimum trip count
560+
// check.
561+
VPBlockUtils::connectBlocks(Plan.getEntry(), ScalarPH);
562+
Plan.getEntry()->swapSuccessors();
555563

556564
auto *ScalarLatchTerm = TheLoop->getLoopLatch()->getTerminator();
557565
// Here we use the same DebugLoc as the scalar loop latch terminator instead

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ static void removeBranchOnCondTrue(VPlan &Plan) {
18461846
using namespace llvm::VPlanPatternMatch;
18471847
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
18481848
vp_depth_first_shallow(Plan.getEntry()))) {
1849-
if (VPBB->getNumSuccessors() != 2 ||
1849+
if (VPBB->getNumSuccessors() != 2 || VPBB == Plan.getEntry() ||
18501850
!match(&VPBB->back(), m_BranchOnCond(m_True())))
18511851
continue;
18521852

llvm/test/Transforms/LoopVectorize/AArch64/sve-tail-folding-forced.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ target triple = "aarch64-unknown-linux-gnu"
1616
; VPLANS-EMPTY:
1717
; VPLANS-NEXT: ir-bb<entry>:
1818
; VPLANS-NEXT: EMIT vp<[[TC]]> = EXPAND SCEV (1 umax %n)
19-
; VPLANS-NEXT: Successor(s): vector.ph
19+
; VPLANS-NEXT: Successor(s): scalar.ph, vector.ph
2020
; VPLANS-EMPTY:
2121
; VPLANS-NEXT: vector.ph:
2222
; VPLANS-NEXT: EMIT vp<[[NEWTC:%[0-9]+]]> = TC > VF ? TC - VF : 0 vp<[[TC]]>

llvm/test/Transforms/LoopVectorize/AArch64/sve-widen-gep.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ target triple = "aarch64-unknown-linux-gnu"
1515
; CHECK-NEXT: Live-in ir<%N> = original trip-count
1616
; CHECK-EMPTY:
1717
; CHECK-NEXT: ir-bb<entry>:
18-
; CHECK-NEXT: Successor(s): vector.ph
18+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
1919
; CHECK-EMPTY:
2020
; CHECK-NEXT: vector.ph:
2121
; CHECK-NEXT: vp<[[END1:%.+]]> = DERIVED-IV ir<%start.1> + vp<[[VEC_TC]]> * ir<8>

llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt-vplan.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ target triple = "aarch64-unknown-linux-gnu"
1818
; CHECK-NEXT: Live-in [[OTC:.*]] = original trip-count
1919
; CHECK-EMPTY:
2020
; CHECK-NEXT: ir-bb<entry>:
21-
; CHECK-NEXT: Successor(s): vector.ph
21+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
2222
; CHECK-EMPTY:
2323
; CHECK-NEXT: vector.ph:
2424
; CHECK-NEXT: Successor(s): vector loop
@@ -45,6 +45,9 @@ target triple = "aarch64-unknown-linux-gnu"
4545
; CHECK-NEXT: EMIT branch-on-cond [[TC_CHECK]]
4646
; CHECK-NEXT: Successor(s): ir-bb<for.exit>, scalar.ph
4747
; CHECK-EMPTY:
48+
; CHECK-NEXT: ir-bb<for.exit>:
49+
; CHECK-NEXT: No successors
50+
; CHECK-EMPTY:
4851
; CHECK-NEXT: scalar.ph:
4952
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi [[VTC]], ir<0>
5053
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -53,9 +56,6 @@ target triple = "aarch64-unknown-linux-gnu"
5356
; CHECK-NEXT: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
5457
; CHECK: IR %exitcond = icmp eq i64 %iv.next, %N
5558
; CHECK-NEXT: No successors
56-
; CHECK-EMPTY:
57-
; CHECK-NEXT: ir-bb<for.exit>:
58-
; CHECK-NEXT: No successors
5959
; CHECK-NEXT: }
6060

6161
;; Check that the vectorized plan contains a histogram recipe instead.
@@ -66,7 +66,7 @@ target triple = "aarch64-unknown-linux-gnu"
6666
; CHECK-NEXT: Live-in [[OTC:.*]] = original trip-count
6767
; CHECK-EMPTY:
6868
; CHECK-NEXT: ir-bb<entry>:
69-
; CHECK-NEXT: Successor(s): vector.ph
69+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
7070
; CHECK-EMPTY:
7171
; CHECK-NEXT: vector.ph:
7272
; CHECK-NEXT: Successor(s): vector loop
@@ -92,6 +92,9 @@ target triple = "aarch64-unknown-linux-gnu"
9292
; CHECK-NEXT: EMIT branch-on-cond [[TC_CHECK]]
9393
; CHECK-NEXT: Successor(s): ir-bb<for.exit>, scalar.ph
9494
; CHECK-EMPTY:
95+
; CHECK-NEXT: ir-bb<for.exit>:
96+
; CHECK-NEXT: No successors
97+
; CHECK-EMPTY:
9598
; CHECK-NEXT: scalar.ph:
9699
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi [[VTC]], ir<0>
97100
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -100,9 +103,6 @@ target triple = "aarch64-unknown-linux-gnu"
100103
; CHECK-NEXT: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
101104
; CHECK: IR %exitcond = icmp eq i64 %iv.next, %N
102105
; CHECK-NEXT: No successors
103-
; CHECK-EMPTY:
104-
; CHECK-NEXT: ir-bb<for.exit>:
105-
; CHECK-NEXT: No successors
106106
; CHECK-NEXT: }
107107

108108
define void @simple_histogram(ptr noalias %buckets, ptr readonly %indices, i64 %N) {

llvm/test/Transforms/LoopVectorize/AArch64/synthesize-mask-for-call.ll

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ target triple = "aarch64-unknown-linux-gnu"
1616
; CHECK-NEXT: Live-in ir<1024> = original trip-count
1717
; CHECK-EMPTY:
1818
; CHECK-NEXT: ir-bb<entry>:
19-
; CHECK-NEXT: Successor(s): vector.ph
19+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
2020
; CHECK-EMPTY:
2121
; CHECK-NEXT: vector.ph:
2222
; CHECK-NEXT: Successor(s): vector loop
@@ -43,6 +43,9 @@ target triple = "aarch64-unknown-linux-gnu"
4343
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
4444
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
4545
; CHECK-EMPTY:
46+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
47+
; CHECK-NEXT: No successors
48+
; CHECK-EMPTY:
4649
; CHECK-NEXT: scalar.ph:
4750
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
4851
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -51,9 +54,6 @@ target triple = "aarch64-unknown-linux-gnu"
5154
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
5255
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
5356
; CHECK-NEXT: No successors
54-
; CHECK-EMPTY:
55-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
56-
; CHECK-NEXT: No successors
5757
; CHECK-NEXT: }
5858

5959
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
@@ -63,7 +63,7 @@ target triple = "aarch64-unknown-linux-gnu"
6363
; CHECK-NEXT: Live-in ir<1024> = original trip-count
6464
; CHECK-EMPTY:
6565
; CHECK-NEXT: ir-bb<entry>:
66-
; CHECK-NEXT: Successor(s): vector.ph
66+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
6767
; CHECK-EMPTY:
6868
; CHECK-NEXT: vector.ph:
6969
; CHECK-NEXT: Successor(s): vector loop
@@ -90,6 +90,9 @@ target triple = "aarch64-unknown-linux-gnu"
9090
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
9191
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
9292
; CHECK-EMPTY:
93+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
94+
; CHECK-NEXT: No successors
95+
; CHECK-EMPTY:
9396
; CHECK-NEXT: scalar.ph:
9497
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
9598
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -98,9 +101,6 @@ target triple = "aarch64-unknown-linux-gnu"
98101
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
99102
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
100103
; CHECK-NEXT: No successors
101-
; CHECK-EMPTY:
102-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
103-
; CHECK-NEXT: No successors
104104
; CHECK-NEXT: }
105105

106106
;; If we have a masked variant at one VF and an unmasked variant at a different
@@ -115,7 +115,7 @@ target triple = "aarch64-unknown-linux-gnu"
115115
; CHECK-NEXT: Live-in ir<1024> = original trip-count
116116
; CHECK-EMPTY:
117117
; CHECK-NEXT: ir-bb<entry>:
118-
; CHECK-NEXT: Successor(s): vector.ph
118+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
119119
; CHECK-EMPTY:
120120
; CHECK-NEXT: vector.ph:
121121
; CHECK-NEXT: Successor(s): vector loop
@@ -142,6 +142,9 @@ target triple = "aarch64-unknown-linux-gnu"
142142
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
143143
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
144144
; CHECK-EMPTY:
145+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
146+
; CHECK-NEXT: No successors
147+
; CHECK-EMPTY:
145148
; CHECK-NEXT: scalar.ph:
146149
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
147150
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -150,9 +153,6 @@ target triple = "aarch64-unknown-linux-gnu"
150153
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
151154
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
152155
; CHECK-NEXT: No successors
153-
; CHECK-EMPTY:
154-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
155-
; CHECK-NEXT: No successors
156156
; CHECK-NEXT: }
157157

158158
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
@@ -162,7 +162,7 @@ target triple = "aarch64-unknown-linux-gnu"
162162
; CHECK-NEXT: Live-in ir<1024> = original trip-count
163163
; CHECK-EMPTY:
164164
; CHECK-NEXT: ir-bb<entry>:
165-
; CHECK-NEXT: Successor(s): vector.ph
165+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
166166
; CHECK-EMPTY:
167167
; CHECK-NEXT: vector.ph:
168168
; CHECK-NEXT: Successor(s): vector loop
@@ -189,6 +189,9 @@ target triple = "aarch64-unknown-linux-gnu"
189189
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
190190
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
191191
; CHECK-EMPTY:
192+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
193+
; CHECK-NEXT: No successors
194+
; CHECK-EMPTY:
192195
; CHECK-NEXT: scalar.ph:
193196
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
194197
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -197,9 +200,6 @@ target triple = "aarch64-unknown-linux-gnu"
197200
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
198201
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
199202
; CHECK-NEXT: No successors
200-
; CHECK-EMPTY:
201-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
202-
; CHECK-NEXT: No successors
203203
; CHECK-NEXT: }
204204

205205
;; If we have two variants at different VFs, neither of which are masked, we
@@ -213,7 +213,7 @@ target triple = "aarch64-unknown-linux-gnu"
213213
; CHECK-NEXT: Live-in ir<1024> = original trip-count
214214
; CHECK-EMPTY:
215215
; CHECK-NEXT: ir-bb<entry>:
216-
; CHECK-NEXT: Successor(s): vector.ph
216+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
217217
; CHECK-EMPTY:
218218
; CHECK-NEXT: vector.ph:
219219
; CHECK-NEXT: Successor(s): vector loop
@@ -240,6 +240,9 @@ target triple = "aarch64-unknown-linux-gnu"
240240
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
241241
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
242242
; CHECK-EMPTY:
243+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
244+
; CHECK-NEXT: No successors
245+
; CHECK-EMPTY:
243246
; CHECK-NEXT: scalar.ph:
244247
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
245248
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -248,9 +251,6 @@ target triple = "aarch64-unknown-linux-gnu"
248251
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
249252
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
250253
; CHECK-NEXT: No successors
251-
; CHECK-EMPTY:
252-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
253-
; CHECK-NEXT: No successors
254254
; CHECK-NEXT: }
255255

256256
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
@@ -260,7 +260,7 @@ target triple = "aarch64-unknown-linux-gnu"
260260
; CHECK-NEXT: Live-in ir<1024> = original trip-count
261261
; CHECK-EMPTY:
262262
; CHECK-NEXT: ir-bb<entry>:
263-
; CHECK-NEXT: Successor(s): vector.ph
263+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
264264
; CHECK-EMPTY:
265265
; CHECK-NEXT: vector.ph:
266266
; CHECK-NEXT: Successor(s): vector loop
@@ -287,6 +287,9 @@ target triple = "aarch64-unknown-linux-gnu"
287287
; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]>
288288
; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup>, scalar.ph
289289
; CHECK-EMPTY:
290+
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
291+
; CHECK-NEXT: No successors
292+
; CHECK-EMPTY:
290293
; CHECK-NEXT: scalar.ph:
291294
; CHECK-NEXT: EMIT vp<[[RESUME:%.+]]> = resume-phi vp<[[VTC]]>, ir<0>
292295
; CHECK-NEXT: Successor(s): ir-bb<for.body>
@@ -295,9 +298,6 @@ target triple = "aarch64-unknown-linux-gnu"
295298
; CHECK-NEXT: IR %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME]]> from scalar.ph)
296299
; CHECK: IR %exitcond = icmp eq i64 %indvars.iv.next, 1024
297300
; CHECK-NEXT: No successors
298-
; CHECK-EMPTY:
299-
; CHECK-NEXT: ir-bb<for.cond.cleanup>:
300-
; CHECK-NEXT: No successors
301301
; CHECK-NEXT: }
302302

303303
define void @test_v4_v4m(ptr noalias %a, ptr readonly %b) #3 {

0 commit comments

Comments
 (0)