@@ -1329,13 +1329,10 @@ CanonicalLoopInfo *OpenMPIRBuilder::createLoopSkeleton(
1329
1329
LoopInfos.emplace_front ();
1330
1330
CanonicalLoopInfo *CL = &LoopInfos.front ();
1331
1331
1332
- CL->Preheader = Preheader;
1333
1332
CL->Header = Header;
1334
1333
CL->Cond = Cond;
1335
- CL->Body = Body;
1336
1334
CL->Latch = Latch;
1337
1335
CL->Exit = Exit;
1338
- CL->After = After;
1339
1336
1340
1337
#ifndef NDEBUG
1341
1338
CL->assertOK ();
@@ -1359,7 +1356,7 @@ OpenMPIRBuilder::createCanonicalLoop(const LocationDescription &Loc,
1359
1356
// Split the loop at the insertion point: Branch to the preheader and move
1360
1357
// every following instruction to after the loop (the After BB). Also, the
1361
1358
// new successor is the loop's after block.
1362
- Builder.CreateBr (CL->Preheader );
1359
+ Builder.CreateBr (CL->getPreheader () );
1363
1360
After->getInstList ().splice (After->begin (), BB->getInstList (),
1364
1361
Builder.GetInsertPoint (), BB->end ());
1365
1362
After->replaceSuccessorsPhiUsesWith (BB, After);
@@ -1791,6 +1788,12 @@ OpenMPIRBuilder::collapseLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
1791
1788
BasicBlock *OrigAfter = Outermost->getAfter ();
1792
1789
Function *F = OrigPreheader->getParent ();
1793
1790
1791
+ // Loop control blocks that may become orphaned later.
1792
+ SmallVector<BasicBlock *, 12 > OldControlBBs;
1793
+ OldControlBBs.reserve (6 * Loops.size ());
1794
+ for (CanonicalLoopInfo *Loop : Loops)
1795
+ Loop->collectControlBlocks (OldControlBBs);
1796
+
1794
1797
// Setup the IRBuilder for inserting the trip count computation.
1795
1798
Builder.SetCurrentDebugLocation (DL);
1796
1799
if (ComputeIP.isSet ())
@@ -1886,10 +1889,6 @@ OpenMPIRBuilder::collapseLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
1886
1889
Loops[i]->getIndVar ()->replaceAllUsesWith (NewIndVars[i]);
1887
1890
1888
1891
// Remove unused parts of the input loops.
1889
- SmallVector<BasicBlock *, 12 > OldControlBBs;
1890
- OldControlBBs.reserve (6 * Loops.size ());
1891
- for (CanonicalLoopInfo *Loop : Loops)
1892
- Loop->collectControlBlocks (OldControlBBs);
1893
1892
removeUnusedBlocksFromParent (OldControlBBs);
1894
1893
1895
1894
for (CanonicalLoopInfo *L : Loops)
@@ -1915,6 +1914,12 @@ OpenMPIRBuilder::tileLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
1915
1914
BasicBlock *InnerEnter = InnermostLoop->getBody ();
1916
1915
BasicBlock *InnerLatch = InnermostLoop->getLatch ();
1917
1916
1917
+ // Loop control blocks that may become orphaned later.
1918
+ SmallVector<BasicBlock *, 12 > OldControlBBs;
1919
+ OldControlBBs.reserve (6 * Loops.size ());
1920
+ for (CanonicalLoopInfo *Loop : Loops)
1921
+ Loop->collectControlBlocks (OldControlBBs);
1922
+
1918
1923
// Collect original trip counts and induction variable to be accessible by
1919
1924
// index. Also, the structure of the original loops is not preserved during
1920
1925
// the construction of the tiled loops, so do it before we scavenge the BBs of
@@ -2074,10 +2079,6 @@ OpenMPIRBuilder::tileLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops,
2074
2079
}
2075
2080
2076
2081
// Remove unused parts of the original loops.
2077
- SmallVector<BasicBlock *, 12 > OldControlBBs;
2078
- OldControlBBs.reserve (6 * Loops.size ());
2079
- for (CanonicalLoopInfo *Loop : Loops)
2080
- Loop->collectControlBlocks (OldControlBBs);
2081
2082
removeUnusedBlocksFromParent (OldControlBBs);
2082
2083
2083
2084
for (CanonicalLoopInfo *L : Loops)
@@ -3321,7 +3322,16 @@ void CanonicalLoopInfo::collectControlBlocks(
3321
3322
// flow. For consistency, this also means we do not add the Body block, which
3322
3323
// is just the entry to the body code.
3323
3324
BBs.reserve (BBs.size () + 6 );
3324
- BBs.append ({Preheader, Header, Cond, Latch, Exit, After});
3325
+ BBs.append ({getPreheader (), Header, Cond, Latch, Exit, getAfter ()});
3326
+ }
3327
+
3328
+ BasicBlock *CanonicalLoopInfo::getPreheader () const {
3329
+ assert (isValid () && " Requires a valid canonical loop" );
3330
+ for (BasicBlock *Pred : predecessors (Header)) {
3331
+ if (Pred != Latch)
3332
+ return Pred;
3333
+ }
3334
+ llvm_unreachable (" Missing preheader" );
3325
3335
}
3326
3336
3327
3337
void CanonicalLoopInfo::assertOK () const {
@@ -3330,6 +3340,10 @@ void CanonicalLoopInfo::assertOK() const {
3330
3340
if (!isValid ())
3331
3341
return ;
3332
3342
3343
+ BasicBlock *Preheader = getPreheader ();
3344
+ BasicBlock *Body = getBody ();
3345
+ BasicBlock *After = getAfter ();
3346
+
3333
3347
// Verify standard control-flow we use for OpenMP loops.
3334
3348
assert (Preheader);
3335
3349
assert (isa<BranchInst>(Preheader->getTerminator ()) &&
@@ -3415,11 +3429,8 @@ void CanonicalLoopInfo::assertOK() const {
3415
3429
}
3416
3430
3417
3431
void CanonicalLoopInfo::invalidate () {
3418
- Preheader = nullptr ;
3419
3432
Header = nullptr ;
3420
3433
Cond = nullptr ;
3421
- Body = nullptr ;
3422
3434
Latch = nullptr ;
3423
3435
Exit = nullptr ;
3424
- After = nullptr ;
3425
3436
}
0 commit comments