blob: 93d4ef346c243d3cccdab3a642d89494da935d5d [file] [log] [blame]
John McCallbd04b742011-05-27 18:34:38 +00001; RUN: opt < %s -inline -S | FileCheck %s
2
3; Test that the inliner correctly handles inlining into invoke sites
4; by appending selectors and forwarding _Unwind_Resume directly to the
5; enclosing landing pad.
6
7%struct.A = type { i8 }
8
9@_ZTIi = external constant i8*
10
11declare void @_ZN1AC1Ev(%struct.A*)
12
13declare void @_ZN1AD1Ev(%struct.A*)
14
15declare i8* @llvm.eh.exception() nounwind readonly
16
17declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind
18
19declare i32 @llvm.eh.typeid.for(i8*) nounwind
20
John McCall046c47e2011-05-28 07:45:59 +000021declare void @llvm.eh.resume(i8*, i32)
John McCallbd04b742011-05-27 18:34:38 +000022
23declare i32 @__gxx_personality_v0(...)
24
25declare i8* @__cxa_begin_catch(i8*)
26
27declare void @__cxa_end_catch()
28
29declare void @_ZSt9terminatev()
30
31define internal void @test0_in() alwaysinline uwtable ssp {
32entry:
33 %a = alloca %struct.A, align 1
34 %b = alloca %struct.A, align 1
35 call void @_ZN1AC1Ev(%struct.A* %a)
36 invoke void @_ZN1AC1Ev(%struct.A* %b)
37 to label %invoke.cont unwind label %lpad
38
39invoke.cont:
40 invoke void @_ZN1AD1Ev(%struct.A* %b)
41 to label %invoke.cont1 unwind label %lpad
42
43invoke.cont1:
44 call void @_ZN1AD1Ev(%struct.A* %a)
45 ret void
46
47lpad:
48 %exn = call i8* @llvm.eh.exception() nounwind
49 %eh.selector = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exn, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i32 0) nounwind
50 invoke void @_ZN1AD1Ev(%struct.A* %a)
51 to label %invoke.cont2 unwind label %terminate.lpad
52
53invoke.cont2:
John McCall046c47e2011-05-28 07:45:59 +000054 call void @llvm.eh.resume(i8* %exn, i32 %eh.selector) noreturn
John McCallbd04b742011-05-27 18:34:38 +000055 unreachable
56
57terminate.lpad:
58 %exn3 = call i8* @llvm.eh.exception() nounwind
59 %eh.selector4 = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exn3, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* null) nounwind
60 call void @_ZSt9terminatev() noreturn nounwind
61 unreachable
62}
63
64define void @test0_out() uwtable ssp {
65entry:
66 invoke void @test0_in()
67 to label %ret unwind label %lpad
68
69ret:
70 ret void
71
72lpad: ; preds = %entry
73 %exn = call i8* @llvm.eh.exception() nounwind
74 %eh.selector = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exn, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*)) nounwind
75 %0 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) nounwind
76 %1 = icmp eq i32 %eh.selector, %0
77 br i1 %1, label %catch, label %eh.resume
78
79catch:
80 %ignored = call i8* @__cxa_begin_catch(i8* %exn) nounwind
81 call void @__cxa_end_catch() nounwind
82 br label %ret
83
84eh.resume:
John McCall046c47e2011-05-28 07:45:59 +000085 call void @llvm.eh.resume(i8* %exn, i32 %eh.selector) noreturn
John McCallbd04b742011-05-27 18:34:38 +000086 unreachable
87}
88
John McCall046c47e2011-05-28 07:45:59 +000089; CHECK: define void @test0_out()
90; CHECK: [[A:%.*]] = alloca %struct.A,
91; CHECK: [[B:%.*]] = alloca %struct.A,
92; CHECK: invoke void @_ZN1AC1Ev(%struct.A* [[A]])
93; CHECK: invoke void @_ZN1AC1Ev(%struct.A* [[B]])
94; CHECK: invoke void @_ZN1AD1Ev(%struct.A* [[B]])
95; CHECK: invoke void @_ZN1AD1Ev(%struct.A* [[A]])
96; CHECK: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* {{%.*}}, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i32 0, i8* bitcast (i8** @_ZTIi to i8*))
John McCallbd04b742011-05-27 18:34:38 +000097; CHECK-NEXT: invoke void @_ZN1AD1Ev(%struct.A* [[A]])
98; CHECK-NEXT: to label %[[LBL:[^\s]+]] unwind
99; CHECK: [[LBL]]:
100; CHECK-NEXT: br label %[[LPAD:[^\s]+]]
John McCall046c47e2011-05-28 07:45:59 +0000101; CHECK: ret void
102; CHECK: call i8* @llvm.eh.exception()
John McCallbd04b742011-05-27 18:34:38 +0000103; CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* {{%.*}}, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*))
John McCall046c47e2011-05-28 07:45:59 +0000104; CHECK-NEXT: br label %[[LPAD]]
105; CHECK: [[LPAD]]:
106; CHECK-NEXT: phi i8* [
107; CHECK-NEXT: phi i32 [
108; CHECK-NEXT: call i32 @llvm.eh.typeid.for(