summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-03-13 22:59:14 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-03-13 22:59:14 +0000
commitfc0b80d9746e5fd4b45057ab814c67371fb0f9ea (patch)
tree4e1792d9877bf7d0f8cb6090004afe0f8cfc31df /test
parent557f7f88ba686886278f83159b7a629c24a47176 (diff)
downloadllvm-fc0b80d9746e5fd4b45057ab814c67371fb0f9ea.tar.gz
llvm-fc0b80d9746e5fd4b45057ab814c67371fb0f9ea.tar.bz2
llvm-fc0b80d9746e5fd4b45057ab814c67371fb0f9ea.tar.xz
Fix PR3784: If the source of a phi comes from a bb ended with an invoke, make sure the copy is inserted before the try range (unless it's used as an input to the invoke, then insert it after the last use), not at the end of the bb.
Also re-apply r66140 which was disabled as a workaround. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66976 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/X86/2009-03-13-PHIElimBug.ll37
-rw-r--r--test/CodeGen/X86/split-eh-lpad-edges.ll34
2 files changed, 71 insertions, 0 deletions
diff --git a/test/CodeGen/X86/2009-03-13-PHIElimBug.ll b/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
new file mode 100644
index 0000000000..ea4150c22c
--- /dev/null
+++ b/test/CodeGen/X86/2009-03-13-PHIElimBug.ll
@@ -0,0 +1,37 @@
+; RUN: llvm-as < %s | llc -mtriple=i386-pc-linux-gnu -stats |& grep phielim | grep {Number of EH try blocks skipped} | grep 4
+; 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 }
+
+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]
+
+.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
+}
+
+declare i32 @report__ident_int(i32)
+
+declare i8* @__gnat_malloc(i32)
diff --git a/test/CodeGen/X86/split-eh-lpad-edges.ll b/test/CodeGen/X86/split-eh-lpad-edges.ll
index 2cc8e54672..7808ad6316 100644
--- a/test/CodeGen/X86/split-eh-lpad-edges.ll
+++ b/test/CodeGen/X86/split-eh-lpad-edges.ll
@@ -1,5 +1,39 @@
; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin | not grep jmp
; rdar://6647639
+
+ %struct.FetchPlanHeader = type { i8*, i8*, i32, i8*, i8*, i8*, i8*, i8*, %struct.NSObject* (%struct.NSObject*, %struct.objc_selector*, ...)*, %struct.__attributeDescriptionFlags }
+ %struct.NSArray = type { %struct.NSObject }
+ %struct.NSAutoreleasePool = type { %struct.NSObject, i8*, i8*, i8*, i8* }
+ %struct.NSObject = type { %struct.NSObject* }
+ %struct.__attributeDescriptionFlags = type <{ i32 }>
+ %struct._message_ref_t = type { %struct.NSObject* (%struct.NSObject*, %struct._message_ref_t*, ...)*, %struct.objc_selector* }
+ %struct.objc_selector = type opaque
+@"\01l_objc_msgSend_fixup_alloc" = external global %struct._message_ref_t, align 16 ; <%struct._message_ref_t*> [#uses=2]
+
+define %struct.NSArray* @newFetchedRowsForFetchPlan_MT(%struct.FetchPlanHeader* %fetchPlan, %struct.objc_selector* %selectionMethod, %struct.NSObject* %selectionParameter) ssp {
+entry:
+ %0 = invoke %struct.NSObject* null(%struct.NSObject* null, %struct._message_ref_t* @"\01l_objc_msgSend_fixup_alloc")
+ to label %invcont unwind label %lpad ; <%struct.NSObject*> [#uses=1]
+
+invcont: ; preds = %entry
+ %1 = invoke %struct.NSObject* (%struct.NSObject*, %struct.objc_selector*, ...)* @objc_msgSend(%struct.NSObject* %0, %struct.objc_selector* null)
+ to label %invcont26 unwind label %lpad ; <%struct.NSObject*> [#uses=0]
+
+invcont26: ; preds = %invcont
+ %2 = invoke %struct.NSObject* null(%struct.NSObject* null, %struct._message_ref_t* @"\01l_objc_msgSend_fixup_alloc")
+ to label %invcont27 unwind label %lpad ; <%struct.NSObject*> [#uses=0]
+
+invcont27: ; preds = %invcont26
+ unreachable
+
+lpad: ; preds = %invcont26, %invcont, %entry
+ %pool.1 = phi %struct.NSAutoreleasePool* [ null, %entry ], [ null, %invcont ], [ null, %invcont26 ] ; <%struct.NSAutoreleasePool*> [#uses=0]
+ unreachable
+}
+
+declare %struct.NSObject* @objc_msgSend(%struct.NSObject*, %struct.objc_selector*, ...)
+; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin | not grep jmp
+; rdar://6647639
; XFAIL: *
%struct.FetchPlanHeader = type { i8*, i8*, i32, i8*, i8*, i8*, i8*, i8*, %struct.NSObject* (%struct.NSObject*, %struct.objc_selector*, ...)*, %struct.__attributeDescriptionFlags }