Reapply r142920 with fix:
authorBill Wendling <isanbard@gmail.com>
Wed, 26 Oct 2011 01:10:25 +0000 (01:10 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 26 Oct 2011 01:10:25 +0000 (01:10 +0000)
An MBB which branches to an EH landing pad shouldn't be considered for tail merging.

In SjLj EH, the jump to the landing pad is not done explicitly through a branch
statement. The EH landing pad is added as a successor to the throwing
BB. Because of that however, the branch folding pass could mistakenly think that
it could merge the throwing BB with another BB. This isn't safe to do.
<rdar://problem/10334833>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143001 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/BranchFolding.cpp

index 75288b0934cbe55b7b34c1c4053ecf0c1892114b..5dec3681127dbc75f3de5c903c0d46834bb448b2 100644 (file)
@@ -870,6 +870,9 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
         // Visit each predecessor only once.
         if (!UniquePreds.insert(PBB))
           continue;
+        // Skip blocks which may jump to a landing pad. Can't tail merge these.
+        if (PBB->getLandingPadSuccessor())
+          continue;
         MachineBasicBlock *TBB = 0, *FBB = 0;
         SmallVector<MachineOperand, 4> Cond;
         if (!TII->AnalyzeBranch(*PBB, TBB, FBB, Cond, true)) {