xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/dwarf-eh-prepare.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -mtriple=x86_64-linux-gnu -dwarfehprepare < %s -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Check basic functionality of IR-to-IR DWARF EH preparation. This should
4*9880d681SAndroid Build Coastguard Worker; eliminate resumes. This pass requires a TargetMachine, so we put it under X86
5*9880d681SAndroid Build Coastguard Worker; and provide an x86 triple.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker@int_typeinfo = global i8 0
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdeclare void @might_throw()
10*9880d681SAndroid Build Coastguard Workerdeclare void @cleanup()
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i32 @simple_cleanup_catch() personality i32 (...)* @__gxx_personality_v0 {
13*9880d681SAndroid Build Coastguard Worker  invoke void @might_throw()
14*9880d681SAndroid Build Coastguard Worker          to label %cont unwind label %lpad
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @simple_cleanup_catch()
17*9880d681SAndroid Build Coastguard Worker; CHECK: invoke void @might_throw()
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workercont:
20*9880d681SAndroid Build Coastguard Worker  ret i32 0
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerlpad:
25*9880d681SAndroid Build Coastguard Worker  %ehvals = landingpad { i8*, i32 }
26*9880d681SAndroid Build Coastguard Worker      cleanup
27*9880d681SAndroid Build Coastguard Worker      catch i8* @int_typeinfo
28*9880d681SAndroid Build Coastguard Worker  %ehptr = extractvalue { i8*, i32 } %ehvals, 0
29*9880d681SAndroid Build Coastguard Worker  %ehsel = extractvalue { i8*, i32 } %ehvals, 1
30*9880d681SAndroid Build Coastguard Worker  call void @cleanup()
31*9880d681SAndroid Build Coastguard Worker  %int_sel = call i32 @llvm.eh.typeid.for(i8* @int_typeinfo)
32*9880d681SAndroid Build Coastguard Worker  %int_match = icmp eq i32 %ehsel, %int_sel
33*9880d681SAndroid Build Coastguard Worker  br i1 %int_match, label %catch_int, label %eh.resume
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK: lpad:
36*9880d681SAndroid Build Coastguard Worker; CHECK: landingpad { i8*, i32 }
37*9880d681SAndroid Build Coastguard Worker; CHECK: call void @cleanup()
38*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.eh.typeid.for
39*9880d681SAndroid Build Coastguard Worker; CHECK: br i1
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workercatch_int:
42*9880d681SAndroid Build Coastguard Worker  ret i32 1
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; CHECK: catch_int:
45*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workereh.resume:
48*9880d681SAndroid Build Coastguard Worker  %tmp_ehvals = insertvalue { i8*, i32 } undef, i8* %ehptr, 0
49*9880d681SAndroid Build Coastguard Worker  %new_ehvals = insertvalue { i8*, i32 } %tmp_ehvals, i32 %ehsel, 1
50*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %new_ehvals
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK: eh.resume:
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @_Unwind_Resume(i8* %ehptr)
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i32 @catch_no_resume() personality i32 (...)* @__gxx_personality_v0 {
58*9880d681SAndroid Build Coastguard Worker  invoke void @might_throw()
59*9880d681SAndroid Build Coastguard Worker          to label %cont unwind label %lpad
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workercont:
62*9880d681SAndroid Build Coastguard Worker  ret i32 0
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerlpad:
65*9880d681SAndroid Build Coastguard Worker  %ehvals = landingpad { i8*, i32 }
66*9880d681SAndroid Build Coastguard Worker      catch i8* @int_typeinfo
67*9880d681SAndroid Build Coastguard Worker  %ehptr = extractvalue { i8*, i32 } %ehvals, 0
68*9880d681SAndroid Build Coastguard Worker  %ehsel = extractvalue { i8*, i32 } %ehvals, 1
69*9880d681SAndroid Build Coastguard Worker  %int_sel = call i32 @llvm.eh.typeid.for(i8* @int_typeinfo)
70*9880d681SAndroid Build Coastguard Worker  %int_match = icmp eq i32 %ehsel, %int_sel
71*9880d681SAndroid Build Coastguard Worker  br i1 %int_match, label %catch_int, label %eh.resume
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workercatch_int:
74*9880d681SAndroid Build Coastguard Worker  ret i32 1
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workereh.resume:
77*9880d681SAndroid Build Coastguard Worker  %tmp_ehvals = insertvalue { i8*, i32 } undef, i8* %ehptr, 0
78*9880d681SAndroid Build Coastguard Worker  %new_ehvals = insertvalue { i8*, i32 } %tmp_ehvals, i32 %ehsel, 1
79*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %new_ehvals
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; Check that we can prune the unreachable resume instruction.
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @catch_no_resume() personality i32 (...)* @__gxx_personality_v0 {
85*9880d681SAndroid Build Coastguard Worker; CHECK: invoke void @might_throw()
86*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
87*9880d681SAndroid Build Coastguard Worker; CHECK: lpad:
88*9880d681SAndroid Build Coastguard Worker; CHECK: landingpad { i8*, i32 }
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1
90*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1
91*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @_Unwind_Resume
92*9880d681SAndroid Build Coastguard Worker; CHECK: {{^[}]}}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine i32 @catch_cleanup_merge() personality i32 (...)* @__gxx_personality_v0 {
96*9880d681SAndroid Build Coastguard Worker  invoke void @might_throw()
97*9880d681SAndroid Build Coastguard Worker          to label %inner_invoke unwind label %outer_lpad
98*9880d681SAndroid Build Coastguard Workerinner_invoke:
99*9880d681SAndroid Build Coastguard Worker  invoke void @might_throw()
100*9880d681SAndroid Build Coastguard Worker          to label %cont unwind label %inner_lpad
101*9880d681SAndroid Build Coastguard Workercont:
102*9880d681SAndroid Build Coastguard Worker  ret i32 0
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerouter_lpad:
105*9880d681SAndroid Build Coastguard Worker  %ehvals1 = landingpad { i8*, i32 }
106*9880d681SAndroid Build Coastguard Worker      catch i8* @int_typeinfo
107*9880d681SAndroid Build Coastguard Worker  br label %catch.dispatch
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerinner_lpad:
110*9880d681SAndroid Build Coastguard Worker  %ehvals2 = landingpad { i8*, i32 }
111*9880d681SAndroid Build Coastguard Worker      cleanup
112*9880d681SAndroid Build Coastguard Worker      catch i8* @int_typeinfo
113*9880d681SAndroid Build Coastguard Worker  call void @cleanup()
114*9880d681SAndroid Build Coastguard Worker  br label %catch.dispatch
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workercatch.dispatch:
117*9880d681SAndroid Build Coastguard Worker  %ehvals = phi { i8*, i32 } [ %ehvals1, %outer_lpad ], [ %ehvals2, %inner_lpad ]
118*9880d681SAndroid Build Coastguard Worker  %ehptr = extractvalue { i8*, i32 } %ehvals, 0
119*9880d681SAndroid Build Coastguard Worker  %ehsel = extractvalue { i8*, i32 } %ehvals, 1
120*9880d681SAndroid Build Coastguard Worker  %int_sel = call i32 @llvm.eh.typeid.for(i8* @int_typeinfo)
121*9880d681SAndroid Build Coastguard Worker  %int_match = icmp eq i32 %ehsel, %int_sel
122*9880d681SAndroid Build Coastguard Worker  br i1 %int_match, label %catch_int, label %eh.resume
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workercatch_int:
125*9880d681SAndroid Build Coastguard Worker  ret i32 1
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workereh.resume:
128*9880d681SAndroid Build Coastguard Worker  %tmp_ehvals = insertvalue { i8*, i32 } undef, i8* %ehptr, 0
129*9880d681SAndroid Build Coastguard Worker  %new_ehvals = insertvalue { i8*, i32 } %tmp_ehvals, i32 %ehsel, 1
130*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %new_ehvals
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; We can't prune this merge because one landingpad is a cleanup pad.
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @catch_cleanup_merge()
136*9880d681SAndroid Build Coastguard Worker; CHECK: invoke void @might_throw()
137*9880d681SAndroid Build Coastguard Worker; CHECK: invoke void @might_throw()
138*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
139*9880d681SAndroid Build Coastguard Worker;
140*9880d681SAndroid Build Coastguard Worker; CHECK: outer_lpad:
141*9880d681SAndroid Build Coastguard Worker; CHECK: landingpad { i8*, i32 }
142*9880d681SAndroid Build Coastguard Worker; CHECK: br label %catch.dispatch
143*9880d681SAndroid Build Coastguard Worker;
144*9880d681SAndroid Build Coastguard Worker; CHECK: inner_lpad:
145*9880d681SAndroid Build Coastguard Worker; CHECK: landingpad { i8*, i32 }
146*9880d681SAndroid Build Coastguard Worker; CHECK: call void @cleanup()
147*9880d681SAndroid Build Coastguard Worker; CHECK: br label %catch.dispatch
148*9880d681SAndroid Build Coastguard Worker;
149*9880d681SAndroid Build Coastguard Worker; CHECK: catch.dispatch:
150*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.eh.typeid.for
151*9880d681SAndroid Build Coastguard Worker; CHECK: br i1
152*9880d681SAndroid Build Coastguard Worker; CHECK: catch_int:
153*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1
154*9880d681SAndroid Build Coastguard Worker; CHECK: eh.resume:
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @_Unwind_Resume(i8* %ehptr)
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...)
158*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.eh.typeid.for(i8*)
159