[llvm] r261731 - [SimplifyCFG] Do not blindly remove unreachable blocks

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 24 02:02:17 PST 2016


Author: majnemer
Date: Wed Feb 24 04:02:16 2016
New Revision: 261731

URL: http://llvm.org/viewvc/llvm-project?rev=261731&view=rev
Log:
[SimplifyCFG] Do not blindly remove unreachable blocks

DeleteDeadBlock was called indiscriminately, leading to cleanuprets with
undef cleanuppad references.

Instead, try to drain the BB of most of it's instructions if it is
unreachable.  We can then remove the BB if it solely consists of a
terminator (and maybe some phis).

Added:
    llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=261731&r1=261730&r2=261731&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Feb 24 04:02:16 2016
@@ -5278,9 +5278,17 @@ bool SimplifyCFGOpt::run(BasicBlock *BB)
   if ((pred_empty(BB) &&
        BB != &BB->getParent()->getEntryBlock()) ||
       BB->getSinglePredecessor() == BB) {
-    DEBUG(dbgs() << "Removing BB: \n" << *BB);
-    DeleteDeadBlock(BB);
-    return true;
+    // Get the block mostly empty.
+    Changed |= removeAllNonTerminatorAndEHPadInstructions(BB) > 0;
+    // Now, verify that we succeeded getting the block empty.
+    // This will not be the case if this unreachable BB creates a token which is
+    // consumed by other unreachable blocks.
+    Instruction *FirstNonPHI = BB->getFirstNonPHI();
+    if (isa<TerminatorInst>(FirstNonPHI) && FirstNonPHI->use_empty()) {
+      DEBUG(dbgs() << "Removing BB: \n" << *BB);
+      DeleteDeadBlock(BB);
+      return true;
+    }
   }
 
   // Check to see if we can constant propagate this terminator instruction

Added: llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll?rev=261731&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll Wed Feb 24 04:02:16 2016
@@ -0,0 +1,40 @@
+; RUN: opt -simplifycfg -S < %s | FileCheck %s
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-win32"
+
+declare i32 @__CxxFrameHandler3(...)
+
+declare void @fn_2()
+
+define void @fn_1(i1 %B) personality i32 (...)* @__CxxFrameHandler3 {
+entry:
+  br i1 %B, label %__Ea.exit, label %lor.lhs.false.i.i
+
+lor.lhs.false.i.i:
+  br i1 %B, label %if.end.i.i, label %__Ea.exit
+
+if.end.i.i:
+  invoke void @fn_2()
+          to label %__Ea.exit unwind label %ehcleanup.i
+
+ehcleanup.i:
+  %t4 = cleanuppad within none []
+  br label %arraydestroy.body.i
+
+arraydestroy.body.i:
+  %gep = getelementptr i8, i8* null, i32 -1
+  br label %dtor.exit.i
+
+dtor.exit.i:
+  br i1 %B, label %arraydestroy.done3.i, label %arraydestroy.body.i
+
+arraydestroy.done3.i:
+  cleanupret from %t4 unwind to caller
+
+__Ea.exit:
+  ret void
+}
+
+; CHECK-LABEL: define void @fn_1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret void




More information about the llvm-commits mailing list