Skip to content

Commit

Permalink
Make loop preheader insertion in LoopSimplify handle the case where t…
Browse files Browse the repository at this point in the history
…he loop header is a landing pad correctly (by splitting the landingpad out of the loop header). Make some adjustments to the rest of LoopSimplify to make it clear that the rest of LoopSimplify isn't making bad assumptions about the presence of landing pads. PR11575.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146621 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eefriedman committed Dec 15, 2011
1 parent 7a13b72 commit 7d1ff37
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 16 deletions.
50 changes: 34 additions & 16 deletions lib/Transforms/Utils/LoopSimplify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ namespace {
bool ProcessLoop(Loop *L, LPPassManager &LPM);
BasicBlock *RewriteLoopExitBlock(Loop *L, BasicBlock *Exit);
BasicBlock *InsertPreheaderForLoop(Loop *L);
Loop *SeparateNestedLoop(Loop *L, LPPassManager &LPM);
Loop *SeparateNestedLoop(Loop *L, LPPassManager &LPM,
BasicBlock *Preheader);
BasicBlock *InsertUniqueBackedgeBlock(Loop *L, BasicBlock *Preheader);
void PlaceSplitBlockCarefully(BasicBlock *NewBB,
SmallVectorImpl<BasicBlock*> &SplitPreds,
Expand Down Expand Up @@ -240,7 +241,7 @@ bool LoopSimplify::ProcessLoop(Loop *L, LPPassManager &LPM) {
// this for loops with a giant number of backedges, just factor them into a
// common backedge instead.
if (L->getNumBackEdges() < 8) {
if (SeparateNestedLoop(L, LPM)) {
if (SeparateNestedLoop(L, LPM, Preheader)) {
++NumNested;
// This is a big restructuring change, reprocess the whole loop.
Changed = true;
Expand Down Expand Up @@ -379,18 +380,27 @@ BasicBlock *LoopSimplify::InsertPreheaderForLoop(Loop *L) {
}

// Split out the loop pre-header.
BasicBlock *NewBB =
SplitBlockPredecessors(Header, OutsideBlocks, ".preheader", this);
BasicBlock *PreheaderBB;
if (!Header->isLandingPad()) {
PreheaderBB = SplitBlockPredecessors(Header, OutsideBlocks, ".preheader",
this);
} else {
SmallVector<BasicBlock*, 2> NewBBs;
SplitLandingPadPredecessors(Header, OutsideBlocks, ".preheader",
".split-lp", this, NewBBs);
PreheaderBB = NewBBs[0];
}

NewBB->getTerminator()->setDebugLoc(Header->getFirstNonPHI()->getDebugLoc());
DEBUG(dbgs() << "LoopSimplify: Creating pre-header " << NewBB->getName()
<< "\n");
PreheaderBB->getTerminator()->setDebugLoc(
Header->getFirstNonPHI()->getDebugLoc());
DEBUG(dbgs() << "LoopSimplify: Creating pre-header "
<< PreheaderBB->getName() << "\n");

// Make sure that NewBB is put someplace intelligent, which doesn't mess up
// code layout too horribly.
PlaceSplitBlockCarefully(NewBB, OutsideBlocks, L);
PlaceSplitBlockCarefully(PreheaderBB, OutsideBlocks, L);

return NewBB;
return PreheaderBB;
}

/// RewriteLoopExitBlock - Ensure that the loop preheader dominates all exit
Expand Down Expand Up @@ -526,7 +536,17 @@ void LoopSimplify::PlaceSplitBlockCarefully(BasicBlock *NewBB,
/// If we are able to separate out a loop, return the new outer loop that was
/// created.
///
Loop *LoopSimplify::SeparateNestedLoop(Loop *L, LPPassManager &LPM) {
Loop *LoopSimplify::SeparateNestedLoop(Loop *L, LPPassManager &LPM,
BasicBlock *Preheader) {
// Don't try to separate loops without a preheader (this excludes
// loop headers which are targeted by an indirectbr).
if (!Preheader)
return 0;

// The header is not a landing pad; preheader insertion should ensure this.
assert(!L->getHeader()->isLandingPad() &&
"Can't insert backedge to landing pad");

PHINode *PN = FindPHIToPartitionLoops(L, DT, AA, LI);
if (PN == 0) return 0; // No known way to partition.

Expand All @@ -536,13 +556,8 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L, LPPassManager &LPM) {
SmallVector<BasicBlock*, 8> OuterLoopPreds;
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
if (PN->getIncomingValue(i) != PN ||
!L->contains(PN->getIncomingBlock(i))) {
// We can't split indirectbr edges.
if (isa<IndirectBrInst>(PN->getIncomingBlock(i)->getTerminator()))
return 0;

!L->contains(PN->getIncomingBlock(i)))
OuterLoopPreds.push_back(PN->getIncomingBlock(i));
}

DEBUG(dbgs() << "LoopSimplify: Splitting out a new outer loop\n");

Expand Down Expand Up @@ -636,6 +651,9 @@ LoopSimplify::InsertUniqueBackedgeBlock(Loop *L, BasicBlock *Preheader) {
if (!Preheader)
return 0;

// The header is not a landing pad; preheader insertion should ensure this.
assert(!Header->isLandingPad() && "Can't insert backedge to landing pad");

// Figure out which basic blocks contain back-edges to the loop header.
std::vector<BasicBlock*> BackedgeBlocks;
for (pred_iterator I = pred_begin(Header), E = pred_end(Header); I != E; ++I){
Expand Down
45 changes: 45 additions & 0 deletions test/Transforms/LoopSimplify/2011-12-14-LandingpadHeader.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
; RUN: opt < %s -loop-simplify -S | FileCheck %s
; PR11575

@catchtypeinfo = external unnamed_addr constant { i8*, i8*, i8* }

define void @main() uwtable ssp {
entry:
invoke void @f1()
to label %try.cont19 unwind label %catch

; CHECK: catch.preheader:
; CHECK-NEXT: landingpad
; CHECK: br label %catch

; CHECK: catch.split-lp:
; CHECK-NEXT: landingpad
; CHECK: br label %catch

catch: ; preds = %if.else, %entry
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
catch i8* bitcast ({ i8*, i8*, i8* }* @catchtypeinfo to i8*)
invoke void @f3()
to label %if.else unwind label %eh.resume

if.else: ; preds = %catch
invoke void @f2()
to label %try.cont19 unwind label %catch

try.cont19: ; preds = %if.else, %entry
ret void

eh.resume: ; preds = %catch
%1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
cleanup
catch i8* bitcast ({ i8*, i8*, i8* }* @catchtypeinfo to i8*)
resume { i8*, i32 } undef
}

declare i32 @__gxx_personality_v0(...)

declare void @f1()

declare void @f2()

declare void @f3()

0 comments on commit 7d1ff37

Please sign in to comment.