aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll49
-rw-r--r--test/Transforms/ADCE/dead-phi-edge.ll15
2 files changed, 64 insertions, 0 deletions
diff --git a/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll b/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
new file mode 100644
index 0000000000..6e439a7b20
--- /dev/null
+++ b/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
@@ -0,0 +1,49 @@
+; RUN: llvm-as < %s | opt -adce -disable-output
+
+implementation ; Functions:
+
+declare { }* %llvm.dbg.region.end({ }*)
+
+declare void %strlen()
+
+declare void %_ZN10QByteArray6resizeEi()
+
+declare void %q_atomic_decrement()
+
+void %_ZNK10QByteArray13leftJustifiedEicb() {
+entry:
+ invoke void %strlen( )
+ to label %tmp.3.i.noexc unwind label %invoke_catch.0
+
+tmp.3.i.noexc: ; preds = %entry
+ br bool false, label %then.0, label %else.0
+
+invoke_catch.0: ; preds = %entry
+ invoke void %q_atomic_decrement( )
+ to label %tmp.1.i.i183.noexc unwind label %terminate
+
+tmp.1.i.i183.noexc: ; preds = %invoke_catch.0
+ unwind
+
+then.0: ; preds = %tmp.3.i.noexc
+ invoke void %_ZN10QByteArray6resizeEi( )
+ to label %invoke_cont.1 unwind label %invoke_catch.1
+
+invoke_catch.1: ; preds = %then.0
+ invoke void %q_atomic_decrement( )
+ to label %tmp.1.i.i162.noexc unwind label %terminate
+
+tmp.1.i.i162.noexc: ; preds = %invoke_catch.1
+ ret void
+
+invoke_cont.1: ; preds = %then.0
+ ret void
+
+else.0: ; preds = %tmp.3.i.noexc
+ ret void
+
+terminate: ; preds = %invoke_catch.1, %invoke_catch.0
+ %dbg.0.1 = phi { }* [ null, %invoke_catch.1 ], [ null, %invoke_catch.0 ] ; <{ }*> [#uses=1]
+ %dbg.tmp.43 = call { }* %llvm.dbg.region.end( { }* %dbg.0.1 ) ; <{ }*> [#uses=0]
+ unreachable
+}
diff --git a/test/Transforms/ADCE/dead-phi-edge.ll b/test/Transforms/ADCE/dead-phi-edge.ll
new file mode 100644
index 0000000000..b4a10b2699
--- /dev/null
+++ b/test/Transforms/ADCE/dead-phi-edge.ll
@@ -0,0 +1,15 @@
+; RUN: llvm-as < %s | opt -adce | llvm-dis | not grep call
+
+; The call is not live just because the PHI uses the call retval!
+
+int %test(int %X) {
+ br label %Done
+
+DeadBlock:
+ %Y = call int %test(int 0)
+ br label %Done
+
+Done:
+ %Z = phi int [%X, %0], [%Y, %DeadBlock]
+ ret int %Z
+}