summaryrefslogtreecommitdiff
path: root/test/Transforms/Inline/inline_invoke.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms/Inline/inline_invoke.ll')
-rw-r--r--test/Transforms/Inline/inline_invoke.ll31
1 files changed, 29 insertions, 2 deletions
diff --git a/test/Transforms/Inline/inline_invoke.ll b/test/Transforms/Inline/inline_invoke.ll
index 110a82823e..5f657387c2 100644
--- a/test/Transforms/Inline/inline_invoke.ll
+++ b/test/Transforms/Inline/inline_invoke.ll
@@ -4,7 +4,7 @@
; by appending selectors and forwarding _Unwind_Resume directly to the
; enclosing landing pad.
-;; Test 1 - basic functionality.
+;; Test 0 - basic functionality.
%struct.A = type { i8 }
@@ -112,7 +112,7 @@ eh.resume:
; CHECK-NEXT: call i32 @llvm.eh.typeid.for(
-;; Test 2 - Correctly handle phis in outer landing pads.
+;; Test 1 - Correctly handle phis in outer landing pads.
define void @test1_out() uwtable ssp {
entry:
@@ -216,3 +216,30 @@ eh.resume:
; CHECK: call void @use(i32 [[YJ1]])
; CHECK: call void @llvm.eh.resume(i8* [[EXNJ1]], i32 [[SELJ1]])
+
+;; Test 2 - Don't make invalid IR for inlines into landing pads without eh.exception calls
+
+define void @test2_out() uwtable ssp {
+entry:
+ invoke void @test0_in()
+ to label %ret unwind label %lpad
+
+ret:
+ ret void
+
+lpad:
+ call void @_ZSt9terminatev()
+ unreachable
+}
+
+; CHECK: define void @test2_out()
+; CHECK: [[A:%.*]] = alloca %struct.A,
+; CHECK: [[B:%.*]] = alloca %struct.A,
+; CHECK: invoke void @_ZN1AC1Ev(%struct.A* [[A]])
+; CHECK-NEXT: unwind label %[[LPAD:[^\s]+]]
+; CHECK: invoke void @_ZN1AC1Ev(%struct.A* [[B]])
+; CHECK-NEXT: unwind label %[[LPAD2:[^\s]+]]
+; CHECK: invoke void @_ZN1AD1Ev(%struct.A* [[B]])
+; CHECK-NEXT: unwind label %[[LPAD2]]
+; CHECK: invoke void @_ZN1AD1Ev(%struct.A* [[A]])
+; CHECK-NEXT: unwind label %[[LPAD]]