Branch folding is folding a landing pad into a regular BB.

An exception is thrown via a call to _cxa_throw, which we don't expect to
return. Therefore, the "true" part of the invoke goes to a BB that has
'unreachable' as its only instruction. This is lowered into an empty MachineBB.
The landing pad for this invoke, however, is directly after the "true" MBB.
When the empty MBB is removed, the landing pad is directly below the BB with the
invoke call. The unconditional branch is removed and then the two blocks are
merged together.

The testcase is too big for a regression test.
<rdar://problem/9305728>


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129965 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2011-04-22 01:07:09 +00:00
parent c1fe100f35
commit d3dbd5f5cd

View File

@ -1048,7 +1048,7 @@ ReoptimizeBlock:
// AnalyzeBranch. // AnalyzeBranch.
if (PriorCond.empty() && !PriorTBB && MBB->pred_size() == 1 && if (PriorCond.empty() && !PriorTBB && MBB->pred_size() == 1 &&
PrevBB.succ_size() == 1 && PrevBB.succ_size() == 1 &&
!MBB->hasAddressTaken()) { !MBB->hasAddressTaken() && !MBB->isLandingPad()) {
DEBUG(dbgs() << "\nMerging into block: " << PrevBB DEBUG(dbgs() << "\nMerging into block: " << PrevBB
<< "From MBB: " << *MBB); << "From MBB: " << *MBB);
PrevBB.splice(PrevBB.end(), MBB, MBB->begin(), MBB->end()); PrevBB.splice(PrevBB.end(), MBB, MBB->begin(), MBB->end());