aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2009-03-16 19:58:38 +0000
committerDuncan Sands <baldrick@free.fr>2009-03-16 19:58:38 +0000
commitdfec24c87711bac1564465742012d47bd5984c30 (patch)
tree810c6c68125b8b6d3a05e263885c49eb91777111 /test/CodeGen/X86/2009-03-13-PHIElimBug.ll
parent6e1d1470c2c637ecce5e5ac1da358ecabdc1f7e3 (diff)
downloadexternal_llvm-dfec24c87711bac1564465742012d47bd5984c30.zip
external_llvm-dfec24c87711bac1564465742012d47bd5984c30.tar.gz
external_llvm-dfec24c87711bac1564465742012d47bd5984c30.tar.bz2
Tweak the fix for PR3784: be less sensitive about just
how invokes are set up. The fix could be disturbed by register copies coming after the EH_LABEL, and also didn't behave quite right when it was the invoke result that was used in a phi node. Also (see new testcase) fix another phi elimination bug while there: register copies in the landing pad need to come after the EH_LABEL, because that's where execution branches to when unwinding. If they come before the EH_LABEL then they will never be executed... Also tweak the original testcase so it doesn't use a no-longer existing counter. The accumulated phi elimination changes fix two of seven Ada testsuite failures that turned up after landing pad critical edge splitting was turned off. So there's probably more to come. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67049 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86/2009-03-13-PHIElimBug.ll')
-rw-r--r--test/CodeGen/X86/2009-03-13-PHIElimBug.ll55
1 files changed, 23 insertions, 32 deletions
diff --git a/test/CodeGen/X86/2009-03-13-PHIElimBug.ll b/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
index ea4150c..546fdbf 100644
--- a/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
+++ b/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
@@ -1,37 +1,28 @@
-; RUN: llvm-as < %s | llc -mtriple=i386-pc-linux-gnu -stats |& grep phielim | grep {Number of EH try blocks skipped} | grep 4
+; RUN: llvm-as < %s | llc -march=x86 | grep -A 2 {call f} | grep movl
+; Check the register copy comes after the call to f and before the call to g
; PR3784
- %struct.c38002a__arr___XUB = type { i32, i32 }
- %struct.c38002a__arr_name = type { [0 x i32]*, %struct.c38002a__arr___XUB* }
- %struct.c38002a__rec = type { i32, %struct.c38002a__arr_name }
+declare i32 @f()
-define void @_ada_c38002a() {
-entry:
- %0 = invoke i8* @__gnat_malloc(i32 12)
- to label %invcont unwind label %lpad ; <i8*> [#uses=0]
-
-invcont: ; preds = %entry
- %1 = invoke i8* @__gnat_malloc(i32 20)
- to label %invcont1 unwind label %lpad ; <i8*> [#uses=0]
-
-invcont1: ; preds = %invcont
- %2 = invoke i32 @report__ident_int(i32 2)
- to label %.noexc unwind label %lpad ; <i32> [#uses=0]
-
-.noexc: ; preds = %invcont1
- %3 = invoke i32 @report__ident_int(i32 3)
- to label %.noexc88 unwind label %lpad ; <i32> [#uses=0]
+declare i32 @g()
-.noexc88: ; preds = %.noexc
- unreachable
-
-lpad: ; preds = %.noexc, %invcont1, %invcont, %entry
- %r.0 = phi %struct.c38002a__rec* [ null, %entry ], [ null, %invcont ], [ null, %invcont1 ], [ null, %.noexc ] ; <%struct.c38002a__rec*> [#uses=1]
- %4 = getelementptr %struct.c38002a__rec* %r.0, i32 0, i32 0 ; <i32*> [#uses=1]
- %5 = load i32* %4, align 4 ; <i32> [#uses=0]
- ret void
+define i32 @phi() {
+entry:
+ %a = call i32 @f() ; <i32> [#uses=1]
+ %b = invoke i32 @g()
+ to label %cont unwind label %lpad ; <i32> [#uses=1]
+
+cont: ; preds = %entry
+ %x = phi i32 [ %b, %entry ] ; <i32> [#uses=0]
+ %aa = call i32 @g() ; <i32> [#uses=1]
+ %bb = invoke i32 @g()
+ to label %cont2 unwind label %lpad ; <i32> [#uses=1]
+
+cont2: ; preds = %cont
+ %xx = phi i32 [ %bb, %cont ] ; <i32> [#uses=1]
+ ret i32 %xx
+
+lpad: ; preds = %cont, %entry
+ %y = phi i32 [ %a, %entry ], [ %aa, %cont ] ; <i32> [#uses=1]
+ ret i32 %y
}
-
-declare i32 @report__ident_int(i32)
-
-declare i8* @__gnat_malloc(i32)