Arrange for only 1 of multiple branches to landing pad to be kept.
authorDale Johannesen <dalej@apple.com>
Thu, 31 May 2007 21:54:00 +0000 (21:54 +0000)
committerDale Johannesen <dalej@apple.com>
Thu, 31 May 2007 21:54:00 +0000 (21:54 +0000)
Do not remove empty landing pads (EH table needs to be updated)

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

lib/CodeGen/BranchFolding.cpp

index 9d8bada4baf2509f7cb25adc69d7afb1fe91c7d6..48f74d94c875de75a3383b747db9fa9027a12e70 100644 (file)
@@ -684,18 +684,26 @@ static bool CorrectExtraCFGEdges(MachineBasicBlock &MBB,
     }
   }
   
-  MachineBasicBlock::pred_iterator SI = MBB.succ_begin();
+  MachineBasicBlock::succ_iterator SI = MBB.succ_begin();
+  bool foundPad = false;
   while (SI != MBB.succ_end()) {
     if (*SI == DestA && DestA == DestB) {
       DestA = DestB = 0;
+      if ((*SI)->isLandingPad())
+        foundPad = true;
       ++SI;
     } else if (*SI == DestA) {
       DestA = 0;
+      if ((*SI)->isLandingPad())
+        foundPad = true;
       ++SI;
     } else if (*SI == DestB) {
       DestB = 0;
+      if ((*SI)->isLandingPad())
+        foundPad = true;
       ++SI;
-    } else if ((*SI)->isLandingPad()) {
+    } else if ((*SI)->isLandingPad() && !foundPad) {
+      foundPad = true;
       ++SI;
     } else {
       // Otherwise, this is a superfluous edge, remove it.
@@ -832,8 +840,9 @@ void BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
   ++FallThrough;
   
   // If this block is empty, make everyone use its fall-through, not the block
-  // explicitly.
-  if (MBB->empty()) {
+  // explicitly.  Landing pads should not do this since the landing-pad table
+  // points to this block.
+  if (MBB->empty() && !MBB->isLandingPad()) {
     // Dead block?  Leave for cleanup later.
     if (MBB->pred_empty()) return;