xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O1 -mtriple thumbv7-apple-ios6 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Just make sure no one tries to make the assumption that the normal edge of an
3*9880d681SAndroid Build Coastguard Worker; invoke is never a critical edge.  Previously, this code would assert.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%struct.__CFString = type opaque
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare void @bar(%struct.__CFString*, %struct.__CFString*)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine noalias i8* @foo(i8* nocapture %inRefURL) noreturn ssp personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %call = tail call %struct.__CFString* @bar3()
12*9880d681SAndroid Build Coastguard Worker  %call2 = invoke i8* @bar2()
13*9880d681SAndroid Build Coastguard Worker          to label %for.cond unwind label %lpad
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerfor.cond:                                         ; preds = %entry, %for.cond
16*9880d681SAndroid Build Coastguard Worker  invoke void @bar(%struct.__CFString* undef, %struct.__CFString* null)
17*9880d681SAndroid Build Coastguard Worker          to label %for.cond unwind label %lpad5
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerlpad:                                             ; preds = %entry
20*9880d681SAndroid Build Coastguard Worker  %0 = landingpad { i8*, i32 }
21*9880d681SAndroid Build Coastguard Worker          cleanup
22*9880d681SAndroid Build Coastguard Worker  %1 = extractvalue { i8*, i32 } %0, 0
23*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i8*, i32 } %0, 1
24*9880d681SAndroid Build Coastguard Worker  br label %ehcleanup
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerlpad5:                                            ; preds = %for.cond
27*9880d681SAndroid Build Coastguard Worker  %3 = landingpad { i8*, i32 }
28*9880d681SAndroid Build Coastguard Worker          cleanup
29*9880d681SAndroid Build Coastguard Worker  %4 = extractvalue { i8*, i32 } %3, 0
30*9880d681SAndroid Build Coastguard Worker  %5 = extractvalue { i8*, i32 } %3, 1
31*9880d681SAndroid Build Coastguard Worker  invoke void @release(i8* %call2)
32*9880d681SAndroid Build Coastguard Worker          to label %ehcleanup unwind label %terminate.lpad.i.i16
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerterminate.lpad.i.i16:                             ; preds = %lpad5
35*9880d681SAndroid Build Coastguard Worker  %6 = landingpad { i8*, i32 }
36*9880d681SAndroid Build Coastguard Worker          catch i8* null
37*9880d681SAndroid Build Coastguard Worker  tail call void @terminatev() noreturn nounwind
38*9880d681SAndroid Build Coastguard Worker  unreachable
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerehcleanup:                                        ; preds = %lpad5, %lpad
41*9880d681SAndroid Build Coastguard Worker  %exn.slot.0 = phi i8* [ %1, %lpad ], [ %4, %lpad5 ]
42*9880d681SAndroid Build Coastguard Worker  %ehselector.slot.0 = phi i32 [ %2, %lpad ], [ %5, %lpad5 ]
43*9880d681SAndroid Build Coastguard Worker  %7 = bitcast %struct.__CFString* %call to i8*
44*9880d681SAndroid Build Coastguard Worker  invoke void @release(i8* %7)
45*9880d681SAndroid Build Coastguard Worker          to label %_ZN5SmartIPK10__CFStringED1Ev.exit unwind label %terminate.lpad.i.i
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerterminate.lpad.i.i:                               ; preds = %ehcleanup
48*9880d681SAndroid Build Coastguard Worker  %8 = landingpad { i8*, i32 }
49*9880d681SAndroid Build Coastguard Worker          catch i8* null
50*9880d681SAndroid Build Coastguard Worker  tail call void @terminatev() noreturn nounwind
51*9880d681SAndroid Build Coastguard Worker  unreachable
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker_ZN5SmartIPK10__CFStringED1Ev.exit:               ; preds = %ehcleanup
54*9880d681SAndroid Build Coastguard Worker  %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn.slot.0, 0
55*9880d681SAndroid Build Coastguard Worker  %lpad.val12 = insertvalue { i8*, i32 } %lpad.val, i32 %ehselector.slot.0, 1
56*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %lpad.val12
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdeclare %struct.__CFString* @bar3()
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdeclare i8* @bar2()
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_sj0(...)
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdeclare void @release(i8*)
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdeclare void @terminatev()
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; Make sure that the instruction DemoteRegToStack inserts to reload
70*9880d681SAndroid Build Coastguard Worker; %call.i.i.i14.i.i follows the instruction that saves the value to the stack in
71*9880d681SAndroid Build Coastguard Worker; basic block %entry.do.body.i.i.i_crit_edge.
72*9880d681SAndroid Build Coastguard Worker; Previously, DemoteRegToStack would insert a load instruction into the entry
73*9880d681SAndroid Build Coastguard Worker; block to reload %call.i.i.i14.i.i before the phi instruction (%0) in block
74*9880d681SAndroid Build Coastguard Worker; %do.body.i.i.i.
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: __Z4foo1c:
77*9880d681SAndroid Build Coastguard Worker; CHECK: bl __Znwm
78*9880d681SAndroid Build Coastguard Worker; CHECK: {{.*}}@ %do.body.i.i.i.preheader
79*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, [[OFFSET:#[0-9]+]]]
80*9880d681SAndroid Build Coastguard Worker; CHECK: {{.*}}@ %do.body.i.i.i
81*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[R0:r[0-9]+]], [sp, [[OFFSET]]]
82*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[R0]]
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker%"class.std::__1::basic_string" = type { %"class.std::__1::__compressed_pair" }
85*9880d681SAndroid Build Coastguard Worker%"class.std::__1::__compressed_pair" = type { %"class.std::__1::__libcpp_compressed_pair_imp" }
86*9880d681SAndroid Build Coastguard Worker%"class.std::__1::__libcpp_compressed_pair_imp" = type { %"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep" }
87*9880d681SAndroid Build Coastguard Worker%"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep" = type { %union.anon }
88*9880d681SAndroid Build Coastguard Worker%union.anon = type { %"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__long" }
89*9880d681SAndroid Build Coastguard Worker%"struct.std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__long" = type { i32, i32, i8* }
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker@.str = private unnamed_addr constant [12 x i8] c"some_string\00", align 1
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine void @_Z4foo1c(i8 signext %a) personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
94*9880d681SAndroid Build Coastguard Workerentry:
95*9880d681SAndroid Build Coastguard Worker  %s1 = alloca %"class.std::__1::basic_string", align 4
96*9880d681SAndroid Build Coastguard Worker  call void @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm(%"class.std::__1::basic_string"* %s1, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i32 11)
97*9880d681SAndroid Build Coastguard Worker  %call.i.i.i14.i.i = invoke noalias i8* @_Znwm(i32 1024)
98*9880d681SAndroid Build Coastguard Worker          to label %do.body.i.i.i unwind label %lpad.body
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdo.body.i.i.i:                                    ; preds = %entry, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i
101*9880d681SAndroid Build Coastguard Worker  %lsr.iv = phi i32 [ %lsr.iv.next, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i ], [ -1024, %entry ]
102*9880d681SAndroid Build Coastguard Worker  %0 = phi i8* [ %incdec.ptr.i.i.i, %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i ], [ %call.i.i.i14.i.i, %entry ]
103*9880d681SAndroid Build Coastguard Worker  %new.isnull.i.i.i.i = icmp eq i8* %0, null
104*9880d681SAndroid Build Coastguard Worker  br i1 %new.isnull.i.i.i.i, label %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i, label %new.notnull.i.i.i.i
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workernew.notnull.i.i.i.i:                              ; preds = %do.body.i.i.i
107*9880d681SAndroid Build Coastguard Worker  store i8 %a, i8* %0, align 1
108*9880d681SAndroid Build Coastguard Worker  br label %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i: ; preds = %new.notnull.i.i.i.i, %do.body.i.i.i
111*9880d681SAndroid Build Coastguard Worker  %1 = phi i8* [ null, %do.body.i.i.i ], [ %0, %new.notnull.i.i.i.i ]
112*9880d681SAndroid Build Coastguard Worker  %incdec.ptr.i.i.i = getelementptr inbounds i8, i8* %1, i32 1
113*9880d681SAndroid Build Coastguard Worker  %lsr.iv.next = add i32 %lsr.iv, 1
114*9880d681SAndroid Build Coastguard Worker  %cmp.i16.i.i = icmp eq i32 %lsr.iv.next, 0
115*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i16.i.i, label %invoke.cont, label %do.body.i.i.i
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerinvoke.cont:                                      ; preds = %_ZNSt3__116allocator_traitsINS_9allocatorIcEEE9constructIccEEvRS2_PT_RKT0_.exit.i.i.i
118*9880d681SAndroid Build Coastguard Worker  invoke void @_Z4foo2Pci(i8* %call.i.i.i14.i.i, i32 1024)
119*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont5 unwind label %lpad2
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerinvoke.cont5:                                     ; preds = %invoke.cont
122*9880d681SAndroid Build Coastguard Worker  %cmp.i.i.i15 = icmp eq i8* %call.i.i.i14.i.i, null
123*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i.i.i15, label %invoke.cont6, label %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19: ; preds = %invoke.cont5
126*9880d681SAndroid Build Coastguard Worker  call void @_ZdlPv(i8* %call.i.i.i14.i.i)
127*9880d681SAndroid Build Coastguard Worker  br label %invoke.cont6
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerinvoke.cont6:                                     ; preds = %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i19, %invoke.cont5
130*9880d681SAndroid Build Coastguard Worker  %call10 = call %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* %s1)
131*9880d681SAndroid Build Coastguard Worker  ret void
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerlpad.body:                                        ; preds = %entry
134*9880d681SAndroid Build Coastguard Worker  %2 = landingpad { i8*, i32 }
135*9880d681SAndroid Build Coastguard Worker          cleanup
136*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i8*, i32 } %2, 0
137*9880d681SAndroid Build Coastguard Worker  %4 = extractvalue { i8*, i32 } %2, 1
138*9880d681SAndroid Build Coastguard Worker  br label %ehcleanup
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerlpad2:                                            ; preds = %invoke.cont
141*9880d681SAndroid Build Coastguard Worker  %5 = landingpad { i8*, i32 }
142*9880d681SAndroid Build Coastguard Worker          cleanup
143*9880d681SAndroid Build Coastguard Worker  %6 = extractvalue { i8*, i32 } %5, 0
144*9880d681SAndroid Build Coastguard Worker  %7 = extractvalue { i8*, i32 } %5, 1
145*9880d681SAndroid Build Coastguard Worker  %cmp.i.i.i21 = icmp eq i8* %call.i.i.i14.i.i, null
146*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i.i.i21, label %ehcleanup, label %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26: ; preds = %lpad2
149*9880d681SAndroid Build Coastguard Worker  call void @_ZdlPv(i8* %call.i.i.i14.i.i)
150*9880d681SAndroid Build Coastguard Worker  br label %ehcleanup
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerehcleanup:                                        ; preds = %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26, %lpad2, %lpad.body
153*9880d681SAndroid Build Coastguard Worker  %exn.slot.0 = phi i8* [ %3, %lpad.body ], [ %6, %lpad2 ], [ %6, %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26 ]
154*9880d681SAndroid Build Coastguard Worker  %ehselector.slot.0 = phi i32 [ %4, %lpad.body ], [ %7, %lpad2 ], [ %7, %_ZNSt3__113__vector_baseIcNS_9allocatorIcEEE5clearEv.exit.i.i.i26 ]
155*9880d681SAndroid Build Coastguard Worker  %call12 = invoke %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* %s1)
156*9880d681SAndroid Build Coastguard Worker          to label %eh.resume unwind label %terminate.lpad
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workereh.resume:                                        ; preds = %ehcleanup
159*9880d681SAndroid Build Coastguard Worker  %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn.slot.0, 0
160*9880d681SAndroid Build Coastguard Worker  %lpad.val13 = insertvalue { i8*, i32 } %lpad.val, i32 %ehselector.slot.0, 1
161*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %lpad.val13
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerterminate.lpad:                                   ; preds = %ehcleanup
164*9880d681SAndroid Build Coastguard Worker  %8 = landingpad { i8*, i32 }
165*9880d681SAndroid Build Coastguard Worker          catch i8* null
166*9880d681SAndroid Build Coastguard Worker  %9 = extractvalue { i8*, i32 } %8, 0
167*9880d681SAndroid Build Coastguard Worker  call void @__clang_call_terminate(i8* %9)
168*9880d681SAndroid Build Coastguard Worker  unreachable
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdeclare void @_Z4foo2Pci(i8*, i32)
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr hidden void @__clang_call_terminate(i8*) {
174*9880d681SAndroid Build Coastguard Worker  %2 = tail call i8* @__cxa_begin_catch(i8* %0)
175*9880d681SAndroid Build Coastguard Worker  tail call void @_ZSt9terminatev()
176*9880d681SAndroid Build Coastguard Worker  unreachable
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdeclare i8* @__cxa_begin_catch(i8*)
180*9880d681SAndroid Build Coastguard Workerdeclare void @_ZSt9terminatev()
181*9880d681SAndroid Build Coastguard Workerdeclare %"class.std::__1::basic_string"* @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev(%"class.std::__1::basic_string"* returned)
182*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdlPv(i8*) #3
183*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znwm(i32)
184*9880d681SAndroid Build Coastguard Workerdeclare void @_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm(%"class.std::__1::basic_string"*, i8*, i32)
185*9880d681SAndroid Build Coastguard Workerdeclare void @_Unwind_SjLj_Register({ i8*, i32, [4 x i32], i8*, i8*, [5 x i8*] }*)
186*9880d681SAndroid Build Coastguard Workerdeclare void @_Unwind_SjLj_Unregister({ i8*, i32, [4 x i32], i8*, i8*, [5 x i8*] }*)
187*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.frameaddress(i32)
188*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.stacksave()
189*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.stackrestore(i8*)
190*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.eh.sjlj.setjmp(i8*)
191*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.eh.sjlj.lsda()
192*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.eh.sjlj.callsite(i32)
193*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.eh.sjlj.functioncontext(i8*)
194