blob: bd955e3bc9510a8434334486dee5739ddc711cad [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
21declare void @_Unwind_Resume(i8*)
22
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:
54 call void @_Unwind_Resume(i8* %exn) noreturn
55 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:
85 call void @_Unwind_Resume(i8* %exn) noreturn
86 unreachable
87}
88
89; 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*))
97; 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]+]]
101; CHECK: [[LPAD]]:
102; CHECK-NEXT: call i8* @llvm.eh.exception()
103; CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* {{%.*}}, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*))