summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SimplifyCFG
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-02-24 10:02:16 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-02-24 10:02:16 +0000
commitec72e3722033762fdbf828f1ff8ec2cf406411c8 (patch)
tree3850d5f3e50e062601f573ea65632fb7f394042f /llvm/test/Transforms/SimplifyCFG
parente2ad73759d80376f3d450d05843bd86ac408c221 (diff)
downloadbcm5719-llvm-ec72e3722033762fdbf828f1ff8ec2cf406411c8.tar.gz
bcm5719-llvm-ec72e3722033762fdbf828f1ff8ec2cf406411c8.zip
[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). llvm-svn: 261731
Diffstat (limited to 'llvm/test/Transforms/SimplifyCFG')
-rw-r--r--llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll40
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll b/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll
new file mode 100644
index 00000000000..9198b2a6ea4
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll
@@ -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
OpenPOWER on IntegriCloud