[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / JumpThreading / landing-pad.ll
blob9c193cc061b568d65be149c15bb0a32c1467efd4
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
4 %class.E = type { ptr, %class.C }
5 %class.C = type { %class.A }
6 %class.A = type { i32 }
7 %class.D = type { %class.F }
8 %class.F = type { %class.E }
9 %class.B = type { ptr }
11 @_ZTV1D = unnamed_addr constant [3 x ptr] [ptr null, ptr @_ZTI1D, ptr @_ZN1D7doApplyEv]
12 @_ZTI1D = external unnamed_addr constant { ptr, ptr, ptr }
14 define void @_ZN15EditCommandImpl5applyEv(ptr %this) uwtable align 2 {
15 ; CHECK-LABEL: @_ZN15EditCommandImpl5applyEv(
16 ; CHECK-NEXT:  entry:
17 ; CHECK-NEXT:    [[VTABLE:%.*]] = load ptr, ptr [[THIS:%.*]], align 8
18 ; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[VTABLE]], align 8
19 ; CHECK-NEXT:    call void [[TMP0]](ptr [[THIS]])
20 ; CHECK-NEXT:    ret void
22 entry:
23   %vtable = load ptr, ptr %this, align 8
24   %0 = load ptr, ptr %vtable, align 8
25   call void %0(ptr %this)
26   ret void
29 define void @_ZN1DC1Ev(ptr nocapture %this) unnamed_addr uwtable align 2 {
30 ; CHECK-LABEL: @_ZN1DC1Ev(
31 ; CHECK-NEXT:  entry:
32 ; CHECK-NEXT:    call void @_ZN24CompositeEditCommandImplC2Ev()
33 ; CHECK-NEXT:    store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[THIS:%.*]], align 8
34 ; CHECK-NEXT:    ret void
36 entry:
37   call void @_ZN24CompositeEditCommandImplC2Ev()
38   store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %this, align 8
39   ret void
42 define void @_ZN1DC2Ev(ptr nocapture %this) unnamed_addr uwtable align 2 {
43 ; CHECK-LABEL: @_ZN1DC2Ev(
44 ; CHECK-NEXT:  entry:
45 ; CHECK-NEXT:    call void @_ZN24CompositeEditCommandImplC2Ev()
46 ; CHECK-NEXT:    store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[THIS:%.*]], align 8
47 ; CHECK-NEXT:    ret void
49 entry:
50   call void @_ZN24CompositeEditCommandImplC2Ev()
51   store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %this, align 8
52   ret void
55 declare void @_ZN24CompositeEditCommandImplC2Ev() #1
57 define void @_ZN1D7doApplyEv(ptr nocapture %this) unnamed_addr nounwind readnone uwtable align 2 {
58 ; CHECK-LABEL: @_ZN1D7doApplyEv(
59 ; CHECK-NEXT:  entry:
60 ; CHECK-NEXT:    ret void
62 entry:
63   ret void
66 define void @_Z3fn1v(i1 %arg) uwtable personality ptr @__gxx_personality_v0 {
67 ; CHECK-LABEL: @_Z3fn1v(
68 ; CHECK-NEXT:  entry:
69 ; CHECK-NEXT:    [[CALL:%.*]] = call noalias ptr @_Znwm()
70 ; CHECK-NEXT:    invoke void @_ZN24CompositeEditCommandImplC2Ev()
71 ; CHECK-NEXT:    to label [[_ZN1DC1EV_EXIT:%.*]] unwind label [[LPAD:%.*]]
72 ; CHECK:       _ZN1DC1Ev.exit:
73 ; CHECK-NEXT:    store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr [[CALL]], align 8
74 ; CHECK-NEXT:    [[_REF_I_I_I:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 8
75 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[_REF_I_I_I]], align 4
76 ; CHECK-NEXT:    [[INC_I_I_I:%.*]] = add nsw i32 [[TMP0]], 1
77 ; CHECK-NEXT:    store i32 [[INC_I_I_I]], ptr [[_REF_I_I_I]], align 4
78 ; CHECK-NEXT:    invoke void @_ZN1D7doApplyEv(ptr [[CALL]])
79 ; CHECK-NEXT:    to label [[_ZN15EDITCOMMANDIMPL5APPLYEV_EXIT:%.*]] unwind label [[LPAD1:%.*]]
80 ; CHECK:       _ZN15EditCommandImpl5applyEv.exit:
81 ; CHECK-NEXT:    invoke void @_ZN1D16deleteKeyPressedEv()
82 ; CHECK-NEXT:    to label [[INVOKE_CONT7:%.*]] unwind label [[LPAD1]]
83 ; CHECK:       invoke.cont7:
84 ; CHECK-NEXT:    ret void
85 ; CHECK:       lpad:
86 ; CHECK-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
87 ; CHECK-NEXT:    cleanup
88 ; CHECK-NEXT:    call void @_ZdlPv()
89 ; CHECK-NEXT:    unreachable
90 ; CHECK:       lpad1:
91 ; CHECK-NEXT:    [[TMP2:%.*]] = landingpad { ptr, i32 }
92 ; CHECK-NEXT:    cleanup
93 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[_REF_I_I_I]], align 4
94 ; CHECK-NEXT:    [[TOBOOL_I_I_I:%.*]] = icmp eq i32 [[TMP3]], 0
95 ; CHECK-NEXT:    br i1 [[TOBOOL_I_I_I]], label [[_ZN1BI1DED1EV_EXIT:%.*]], label [[DELETE_NOTNULL_I_I_I:%.*]]
96 ; CHECK:       if.then.i.i.i:
97 ; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[_ZN1BI1DED1EV_EXIT]], label [[DELETE_NOTNULL_I_I_I1:%.*]]
98 ; CHECK:       delete.notnull.i.i.i:
99 ; CHECK-NEXT:    call void @_ZdlPv()
100 ; CHECK-NEXT:    unreachable
101 ; CHECK:       _ZN1BI1DED1Ev.exit:
102 ; CHECK-NEXT:    resume { ptr, i32 } undef
103 ; CHECK:       terminate.lpad:
104 ; CHECK-NEXT:    [[TMP4:%.*]] = landingpad { ptr, i32 }
105 ; CHECK-NEXT:    catch ptr null
106 ; CHECK-NEXT:    unreachable
108 entry:
109   %call = call noalias ptr @_Znwm() #8
110   invoke void @_ZN24CompositeEditCommandImplC2Ev()
111   to label %_ZN1DC1Ev.exit unwind label %lpad
113 _ZN1DC1Ev.exit:                                   ; preds = %entry
114   store ptr getelementptr inbounds ([3 x ptr], ptr @_ZTV1D, i64 0, i64 2), ptr %call, align 8
115   %_ref.i.i.i = getelementptr inbounds i8, ptr %call, i64 8
116   %0 = load i32, ptr %_ref.i.i.i, align 4
117   %inc.i.i.i = add nsw i32 %0, 1
118   store i32 %inc.i.i.i, ptr %_ref.i.i.i, align 4
119   invoke void @_ZN1D7doApplyEv(ptr %call)
120   to label %_ZN15EditCommandImpl5applyEv.exit unwind label %lpad1
122 _ZN15EditCommandImpl5applyEv.exit:                ; preds = %_ZN1DC1Ev.exit
123   invoke void @_ZN1D16deleteKeyPressedEv()
124   to label %invoke.cont7 unwind label %lpad1
126 invoke.cont7:                                     ; preds = %_ZN15EditCommandImpl5applyEv.exit
127   ret void
129 lpad:                                             ; preds = %entry
130   %1 = landingpad { ptr, i32 }
131   cleanup
132   call void @_ZdlPv() #9
133   unreachable
135 lpad1:                                            ; preds = %_ZN1DC1Ev.exit, %_ZN15EditCommandImpl5applyEv.exit
136   %2 = landingpad { ptr, i32 }
137   cleanup
138   %3 = load i32, ptr %_ref.i.i.i, align 4
139   %tobool.i.i.i = icmp eq i32 %3, 0
140   br i1 %tobool.i.i.i, label %_ZN1BI1DED1Ev.exit, label %if.then.i.i.i
142 if.then.i.i.i:                                    ; preds = %lpad1
143   br i1 %arg, label %_ZN1BI1DED1Ev.exit, label %delete.notnull.i.i.i
145 delete.notnull.i.i.i:                             ; preds = %if.then.i.i.i
146   call void @_ZdlPv() #9
147   unreachable
149 _ZN1BI1DED1Ev.exit:                               ; preds = %lpad1, %if.then.i.i.i
150   resume { ptr, i32 } undef
152 terminate.lpad:                                   ; No predecessors!
153   %4 = landingpad { ptr, i32 }
154   catch ptr null
155   unreachable
158 define void @_ZN1BI1DEC1EPS0_(ptr nocapture %this, ptr %p1) unnamed_addr uwtable align 2 {
159 ; CHECK-LABEL: @_ZN1BI1DEC1EPS0_(
160 ; CHECK-NEXT:  entry:
161 ; CHECK-NEXT:    store ptr [[P1:%.*]], ptr [[THIS:%.*]], align 8
162 ; CHECK-NEXT:    [[_REF_I_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[P1]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
163 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[_REF_I_I]], align 4
164 ; CHECK-NEXT:    [[INC_I_I:%.*]] = add nsw i32 [[TMP0]], 1
165 ; CHECK-NEXT:    store i32 [[INC_I_I]], ptr [[_REF_I_I]], align 4
166 ; CHECK-NEXT:    ret void
168 entry:
169   store ptr %p1, ptr %this, align 8
170   %_ref.i.i = getelementptr inbounds %class.D, ptr %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
171   %0 = load i32, ptr %_ref.i.i, align 4
172   %inc.i.i = add nsw i32 %0, 1
173   store i32 %inc.i.i, ptr %_ref.i.i, align 4
174   ret void
177 declare noalias ptr @_Znwm()
179 declare i32 @__gxx_personality_v0(...)
181 declare void @_ZdlPv()
183 define ptr @_ZN1BI1DEptEv(ptr nocapture readonly %this) nounwind readonly uwtable align 2 {
184 ; CHECK-LABEL: @_ZN1BI1DEptEv(
185 ; CHECK-NEXT:  entry:
186 ; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8
187 ; CHECK-NEXT:    ret ptr [[TMP0]]
189 entry:
190   %0 = load ptr, ptr %this, align 8
191   ret ptr %0
194 declare void @_ZN1D16deleteKeyPressedEv()
196 define void @_ZN1BI1DED1Ev(ptr nocapture readonly %this, i1 %arg) unnamed_addr uwtable align 2 {
197 ; CHECK-LABEL: @_ZN1BI1DED1Ev(
198 ; CHECK-NEXT:  entry:
199 ; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8
200 ; CHECK-NEXT:    [[_REF_I_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[TMP0]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
201 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[_REF_I_I]], align 4
202 ; CHECK-NEXT:    [[TOBOOL_I_I:%.*]] = icmp eq i32 [[TMP1]], 0
203 ; CHECK-NEXT:    br i1 [[TOBOOL_I_I]], label [[_ZN1BI1DED2EV_EXIT:%.*]], label [[DELETE_NOTNULL_I_I:%.*]]
204 ; CHECK:       if.then.i.i:
205 ; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[_ZN1BI1DED2EV_EXIT]], label [[DELETE_NOTNULL_I_I1:%.*]]
206 ; CHECK:       delete.notnull.i.i:
207 ; CHECK-NEXT:    call void @_ZdlPv()
208 ; CHECK-NEXT:    unreachable
209 ; CHECK:       _ZN1BI1DED2Ev.exit:
210 ; CHECK-NEXT:    ret void
212 entry:
213   %0 = load ptr, ptr %this, align 8
214   %_ref.i.i = getelementptr inbounds %class.D, ptr %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
215   %1 = load i32, ptr %_ref.i.i, align 4
216   %tobool.i.i = icmp eq i32 %1, 0
217   br i1 %tobool.i.i, label %_ZN1BI1DED2Ev.exit, label %if.then.i.i
219 if.then.i.i:                                      ; preds = %entry
220   br i1 %arg, label %_ZN1BI1DED2Ev.exit, label %delete.notnull.i.i
222 delete.notnull.i.i:                               ; preds = %if.then.i.i
223   call void @_ZdlPv() #9
224   unreachable
226 _ZN1BI1DED2Ev.exit:                               ; preds = %entry, %if.then.i.i
227   ret void
230 declare hidden void @__clang_call_terminate()
232 define void @_ZN1BI1DED2Ev(ptr nocapture readonly %this, i1 %arg) unnamed_addr uwtable align 2 {
233 ; CHECK-LABEL: @_ZN1BI1DED2Ev(
234 ; CHECK-NEXT:  entry:
235 ; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS:%.*]], align 8
236 ; CHECK-NEXT:    [[_REF_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[TMP0]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
237 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[_REF_I]], align 4
238 ; CHECK-NEXT:    [[TOBOOL_I:%.*]] = icmp eq i32 [[TMP1]], 0
239 ; CHECK-NEXT:    br i1 [[TOBOOL_I]], label [[_ZN1AI1CE5DEREFEV_EXIT:%.*]], label [[DELETE_NOTNULL_I:%.*]]
240 ; CHECK:       if.then.i:
241 ; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[_ZN1AI1CE5DEREFEV_EXIT]], label [[DELETE_NOTNULL_I1:%.*]]
242 ; CHECK:       delete.notnull.i:
243 ; CHECK-NEXT:    call void @_ZdlPv()
244 ; CHECK-NEXT:    unreachable
245 ; CHECK:       _ZN1AI1CE5derefEv.exit:
246 ; CHECK-NEXT:    ret void
248 entry:
249   %0 = load ptr, ptr %this, align 8
250   %_ref.i = getelementptr inbounds %class.D, ptr %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
251   %1 = load i32, ptr %_ref.i, align 4
252   %tobool.i = icmp eq i32 %1, 0
253   br i1 %tobool.i, label %_ZN1AI1CE5derefEv.exit, label %if.then.i
255 if.then.i:                                        ; preds = %entry
256   br i1 %arg, label %_ZN1AI1CE5derefEv.exit, label %delete.notnull.i
258 delete.notnull.i:                                 ; preds = %if.then.i
259   call void @_ZdlPv() #9
260   unreachable
262 _ZN1AI1CE5derefEv.exit:                           ; preds = %entry, %if.then.i
263   ret void
266 define void @_ZN1AI1CE5derefEv(ptr nocapture readonly %this, i1 %arg) nounwind uwtable align 2 {
267 ; CHECK-LABEL: @_ZN1AI1CE5derefEv(
268 ; CHECK-NEXT:  entry:
269 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[THIS:%.*]], align 4
270 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[TMP0]], 0
271 ; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[DELETE_NOTNULL:%.*]]
272 ; CHECK:       if.then:
273 ; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[IF_END]], label [[DELETE_NOTNULL1:%.*]]
274 ; CHECK:       delete.notnull:
275 ; CHECK-NEXT:    call void @_ZdlPv()
276 ; CHECK-NEXT:    unreachable
277 ; CHECK:       if.end:
278 ; CHECK-NEXT:    ret void
280 entry:
281   %0 = load i32, ptr %this, align 4
282   %tobool = icmp eq i32 %0, 0
283   br i1 %tobool, label %if.end, label %if.then
285 if.then:                                          ; preds = %entry
286   br i1 %arg, label %if.end, label %delete.notnull
288 delete.notnull:                                   ; preds = %if.then
289   call void @_ZdlPv() #9
290   unreachable
292 if.end:                                           ; preds = %entry, %if.then
293   ret void
296 define void @_ZN1BI1DEC2EPS0_(ptr nocapture %this, ptr %p1) unnamed_addr uwtable align 2 {
297 ; CHECK-LABEL: @_ZN1BI1DEC2EPS0_(
298 ; CHECK-NEXT:  entry:
299 ; CHECK-NEXT:    store ptr [[P1:%.*]], ptr [[THIS:%.*]], align 8
300 ; CHECK-NEXT:    [[_REF_I:%.*]] = getelementptr inbounds [[CLASS_D:%.*]], ptr [[P1]], i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
301 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[_REF_I]], align 4
302 ; CHECK-NEXT:    [[INC_I:%.*]] = add nsw i32 [[TMP0]], 1
303 ; CHECK-NEXT:    store i32 [[INC_I]], ptr [[_REF_I]], align 4
304 ; CHECK-NEXT:    ret void
306 entry:
307   store ptr %p1, ptr %this, align 8
308   %_ref.i = getelementptr inbounds %class.D, ptr %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
309   %0 = load i32, ptr %_ref.i, align 4
310   %inc.i = add nsw i32 %0, 1
311   store i32 %inc.i, ptr %_ref.i, align 4
312   ret void
315 define void @_ZN1AI1CE3refEv(ptr nocapture %this) nounwind uwtable align 2 {
316 ; CHECK-LABEL: @_ZN1AI1CE3refEv(
317 ; CHECK-NEXT:  entry:
318 ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[THIS:%.*]], align 4
319 ; CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP0]], 1
320 ; CHECK-NEXT:    store i32 [[INC]], ptr [[THIS]], align 4
321 ; CHECK-NEXT:    ret void
323 entry:
324   %0 = load i32, ptr %this, align 4
325   %inc = add nsw i32 %0, 1
326   store i32 %inc, ptr %this, align 4
327   ret void