xref: /llvm-project/llvm/test/Transforms/JumpThreading/ddt-crash.ll (revision ead9ad2960ab72bf6142d8aeb164a097a7e407db)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
3
4%struct.ham = type { i8, i8, i16, i32 }
5%struct.zot = type { ptr }
6%struct.quux.0 = type { %struct.wombat }
7%struct.wombat = type { %struct.zot }
8
9@global = external global ptr, align 8
10@global.1 = external constant ptr
11
12declare i32 @wombat.2()
13
14define void @blam() {
15; CHECK-LABEL: @blam(
16; CHECK-NEXT:  bb:
17; CHECK-NEXT:    [[TMP:%.*]] = load i32, ptr undef, align 4
18; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP]], 0
19; CHECK-NEXT:    br i1 [[TMP1]], label [[BB11:%.*]], label [[BB2:%.*]]
20; CHECK:       bb2:
21; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @wombat.2()
22; CHECK-NEXT:    switch i32 [[TMP3]], label [[BB10:%.*]] [
23; CHECK-NEXT:      i32 0, label [[BB7:%.*]]
24; CHECK-NEXT:      i32 1, label [[BB10]]
25; CHECK-NEXT:      i32 2, label [[BB10]]
26; CHECK-NEXT:      i32 3, label [[BB11]]
27; CHECK-NEXT:    ]
28; CHECK:       bb7:
29; CHECK-NEXT:    [[TMP6:%.*]] = tail call i32 @wombat.2()
30; CHECK-NEXT:    br label [[BB11]]
31; CHECK:       bb10:
32; CHECK-NEXT:    ret void
33; CHECK:       bb11:
34; CHECK-NEXT:    ret void
35;
36bb:
37  %tmp = load i32, ptr undef
38  %tmp1 = icmp eq i32 %tmp, 0
39  br i1 %tmp1, label %bb11, label %bb2
40
41bb2:
42  %tmp3 = tail call i32 @wombat.2()
43  switch i32 %tmp3, label %bb4 [
44  i32 0, label %bb5
45  i32 1, label %bb7
46  i32 2, label %bb7
47  i32 3, label %bb11
48  ]
49
50bb4:
51  br label %bb7
52
53bb5:
54  %tmp6 = tail call i32 @wombat.2()
55  br label %bb7
56
57bb7:
58  %tmp8 = phi i32 [ 0, %bb5 ], [ 1, %bb4 ], [ 2, %bb2 ], [ 2, %bb2 ]
59  %tmp9 = icmp eq i32 %tmp8, 0
60  br i1 %tmp9, label %bb11, label %bb10
61
62bb10:
63  ret void
64
65bb11:
66  ret void
67}
68
69define void @spam(ptr %arg, i1 %arg2) {
70; CHECK-LABEL: @spam(
71; CHECK-NEXT:  bb:
72; CHECK-NEXT:    [[TMP:%.*]] = load i8, ptr undef, align 8
73; CHECK-NEXT:    switch i8 [[TMP]], label [[BB11:%.*]] [
74; CHECK-NEXT:      i8 1, label [[BB11]]
75; CHECK-NEXT:      i8 2, label [[BB11]]
76; CHECK-NEXT:      i8 3, label [[BB1:%.*]]
77; CHECK-NEXT:      i8 4, label [[BB1]]
78; CHECK-NEXT:    ]
79; CHECK:       bb1:
80; CHECK-NEXT:    br label [[BB2:%.*]]
81; CHECK:       bb2:
82; CHECK-NEXT:    [[TMP3:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[TMP3]], [[BB8:%.*]] ]
83; CHECK-NEXT:    br label [[BB4:%.*]]
84; CHECK:       bb4:
85; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr undef, align 8
86; CHECK-NEXT:    switch i8 [[TMP5]], label [[BB11]] [
87; CHECK-NEXT:      i8 0, label [[BB11]]
88; CHECK-NEXT:      i8 1, label [[BB10:%.*]]
89; CHECK-NEXT:      i8 2, label [[BB10]]
90; CHECK-NEXT:      i8 3, label [[BB7:%.*]]
91; CHECK-NEXT:      i8 4, label [[BB7]]
92; CHECK-NEXT:    ]
93; CHECK:       bb7:
94; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB8]], label [[BB10]]
95; CHECK:       bb8:
96; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq ptr undef, [[ARG:%.*]]
97; CHECK-NEXT:    br i1 [[TMP9]], label [[BB10]], label [[BB2]]
98; CHECK:       bb10:
99; CHECK-NEXT:    switch i32 [[TMP3]], label [[BB4]] [
100; CHECK-NEXT:      i32 0, label [[BB16:%.*]]
101; CHECK-NEXT:      i32 1, label [[BB11]]
102; CHECK-NEXT:      i32 2, label [[BB12:%.*]]
103; CHECK-NEXT:    ]
104; CHECK:       bb11:
105; CHECK-NEXT:    unreachable
106; CHECK:       bb12:
107; CHECK-NEXT:    [[TMP13:%.*]] = load ptr, ptr undef, align 8
108; CHECK-NEXT:    br label [[BB16]]
109; CHECK:       bb16:
110; CHECK-NEXT:    [[TMP15:%.*]] = phi ptr [ [[TMP13]], [[BB12]] ], [ null, [[BB10]] ]
111; CHECK-NEXT:    [[TMP17:%.*]] = load i8, ptr undef, align 8
112; CHECK-NEXT:    switch i8 [[TMP17]], label [[BB11]] [
113; CHECK-NEXT:      i8 0, label [[BB11]]
114; CHECK-NEXT:      i8 11, label [[BB23:%.*]]
115; CHECK-NEXT:      i8 12, label [[BB23]]
116; CHECK-NEXT:    ]
117; CHECK:       bb23:
118; CHECK-NEXT:    [[TMP21:%.*]] = load ptr, ptr undef, align 8
119; CHECK-NEXT:    [[TMP24:%.*]] = icmp eq ptr [[TMP21]], null
120; CHECK-NEXT:    br i1 [[TMP24]], label [[BB37:%.*]], label [[BB25:%.*]]
121; CHECK:       bb25:
122; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq ptr [[TMP15]], null
123; CHECK-NEXT:    br i1 [[TMP26]], label [[BB41_THREAD:%.*]], label [[BB27:%.*]]
124; CHECK:       bb27:
125; CHECK-NEXT:    [[TMP28:%.*]] = load ptr, ptr undef, align 8
126; CHECK-NEXT:    [[TMP29:%.*]] = icmp eq ptr [[TMP28]], [[TMP21]]
127; CHECK-NEXT:    br i1 [[TMP29]], label [[BB41_THREAD]], label [[BB30:%.*]]
128; CHECK:       bb30:
129; CHECK-NEXT:    [[TMP32_PR:%.*]] = load i8, ptr undef, align 8
130; CHECK-NEXT:    br label [[BB31:%.*]]
131; CHECK:       bb31:
132; CHECK-NEXT:    [[TMP32:%.*]] = phi i8 [ [[TMP32]], [[BB31]] ], [ [[TMP32_PR]], [[BB30]] ]
133; CHECK-NEXT:    [[TMP33:%.*]] = icmp eq i8 [[TMP32]], 0
134; CHECK-NEXT:    br i1 [[TMP33]], label [[BB31]], label [[BB37]]
135; CHECK:       bb37:
136; CHECK-NEXT:    [[TMP36:%.*]] = phi i1 [ false, [[BB23]] ], [ true, [[BB31]] ]
137; CHECK-NEXT:    [[TMP38:%.*]] = icmp eq ptr [[TMP15]], null
138; CHECK-NEXT:    br i1 [[TMP38]], label [[BB39:%.*]], label [[BB41:%.*]]
139; CHECK:       bb39:
140; CHECK-NEXT:    [[TMP364:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ]
141; CHECK-NEXT:    [[TMP40:%.*]] = load ptr, ptr @global, align 8
142; CHECK-NEXT:    br i1 [[TMP364]], label [[BB41_THREAD]], label [[BB41_THREAD]]
143; CHECK:       bb41:
144; CHECK-NEXT:    [[TMP363:%.*]] = phi i1 [ [[TMP36]], [[BB37]] ]
145; CHECK-NEXT:    br i1 [[TMP363]], label [[BB41_THREAD]], label [[BB41_THREAD]]
146; CHECK:       bb41.thread:
147; CHECK-NEXT:    [[TMP0:%.*]] = phi ptr [ undef, [[BB41]] ], [ undef, [[BB39]] ], [ undef, [[BB39]] ], [ undef, [[BB41]] ], [ undef, [[BB27]] ], [ undef, [[BB25]] ]
148; CHECK-NEXT:    ret void
149;
150bb:
151  %tmp = load i8, ptr undef, align 8
152  switch i8 %tmp, label %bb11 [
153  i8 1, label %bb11
154  i8 2, label %bb11
155  i8 3, label %bb1
156  i8 4, label %bb1
157  ]
158
159bb1:
160  br label %bb2
161
162bb2:
163  %tmp3 = phi i32 [ 0, %bb1 ], [ %tmp3, %bb8 ]
164  br label %bb4
165
166bb4:
167  %tmp5 = load i8, ptr undef, align 8
168  switch i8 %tmp5, label %bb11 [
169  i8 0, label %bb11
170  i8 1, label %bb10
171  i8 2, label %bb10
172  i8 3, label %bb6
173  i8 4, label %bb6
174  ]
175
176bb6:
177  br label %bb7
178
179bb7:
180  br i1 %arg2, label %bb8, label %bb10
181
182bb8:
183  %tmp9 = icmp eq ptr undef, %arg
184  br i1 %tmp9, label %bb10, label %bb2
185
186bb10:
187  switch i32 %tmp3, label %bb4 [
188  i32 0, label %bb14
189  i32 1, label %bb11
190  i32 2, label %bb12
191  ]
192
193bb11:
194  unreachable
195
196bb12:
197  %tmp13 = load ptr, ptr undef
198  br label %bb14
199
200bb14:
201  %tmp15 = phi ptr [ %tmp13, %bb12 ], [ null, %bb10 ]
202  br label %bb16
203
204bb16:
205  %tmp17 = load i8, ptr undef, align 8
206  switch i8 %tmp17, label %bb11 [
207  i8 0, label %bb11
208  i8 11, label %bb18
209  i8 12, label %bb18
210  ]
211
212bb18:
213  br label %bb19
214
215bb19:
216  br label %bb20
217
218bb20:
219  %tmp21 = load ptr, ptr undef
220  switch i8 undef, label %bb22 [
221  i8 0, label %bb4
222  i8 11, label %bb10
223  i8 12, label %bb10
224  ]
225
226bb22:
227  br label %bb23
228
229bb23:
230  %tmp24 = icmp eq ptr %tmp21, null
231  br i1 %tmp24, label %bb35, label %bb25
232
233bb25:
234  %tmp26 = icmp eq ptr %tmp15, null
235  br i1 %tmp26, label %bb34, label %bb27
236
237bb27:
238  %tmp28 = load ptr, ptr undef
239  %tmp29 = icmp eq ptr %tmp28, %tmp21
240  br i1 %tmp29, label %bb35, label %bb30
241
242bb30:
243  br label %bb31
244
245bb31:
246  %tmp32 = load i8, ptr undef, align 8
247  %tmp33 = icmp eq i8 %tmp32, 0
248  br i1 %tmp33, label %bb31, label %bb34
249
250bb34:
251  br label %bb35
252
253bb35:
254  %tmp36 = phi i1 [ true, %bb34 ], [ false, %bb23 ], [ true, %bb27 ]
255  br label %bb37
256
257bb37:
258  %tmp38 = icmp eq ptr %tmp15, null
259  br i1 %tmp38, label %bb39, label %bb41
260
261bb39:
262  %tmp40 = load ptr, ptr @global
263  br label %bb41
264
265bb41:
266  %tmp42 = select i1 %tmp36, ptr undef, ptr undef
267  ret void
268}
269
270declare i32 @foo(...)
271
272define void @zot() align 2 personality ptr @foo {
273; CHECK-LABEL: @zot(
274; CHECK-NEXT:  bb:
275; CHECK-NEXT:    invoke void @bar()
276; CHECK-NEXT:            to label [[BB1:%.*]] unwind label [[BB3:%.*]]
277; CHECK:       bb1:
278; CHECK-NEXT:    invoke void @bar()
279; CHECK-NEXT:            to label [[BB2:%.*]] unwind label [[BB4:%.*]]
280; CHECK:       bb2:
281; CHECK-NEXT:    invoke void @bar()
282; CHECK-NEXT:            to label [[BB6:%.*]] unwind label [[BB17:%.*]]
283; CHECK:       bb3:
284; CHECK-NEXT:    [[TMP:%.*]] = landingpad { ptr, i32 }
285; CHECK-NEXT:            catch ptr @global.1
286; CHECK-NEXT:            catch ptr null
287; CHECK-NEXT:    unreachable
288; CHECK:       bb4:
289; CHECK-NEXT:    [[TMP5:%.*]] = landingpad { ptr, i32 }
290; CHECK-NEXT:            catch ptr @global.1
291; CHECK-NEXT:            catch ptr null
292; CHECK-NEXT:    unreachable
293; CHECK:       bb6:
294; CHECK-NEXT:    invoke void @bar()
295; CHECK-NEXT:            to label [[BB7:%.*]] unwind label [[BB19:%.*]]
296; CHECK:       bb7:
297; CHECK-NEXT:    invoke void @bar()
298; CHECK-NEXT:            to label [[BB10:%.*]] unwind label [[BB8:%.*]]
299; CHECK:       bb8:
300; CHECK-NEXT:    [[TMP9:%.*]] = landingpad { ptr, i32 }
301; CHECK-NEXT:            cleanup
302; CHECK-NEXT:            catch ptr @global.1
303; CHECK-NEXT:            catch ptr null
304; CHECK-NEXT:    unreachable
305; CHECK:       bb10:
306; CHECK-NEXT:    [[TMP11:%.*]] = load ptr, ptr undef, align 8
307; CHECK-NEXT:    [[TMP12:%.*]] = invoke i32 [[TMP11]](ptr nonnull undef)
308; CHECK-NEXT:            to label [[BB13:%.*]] unwind label [[BB21:%.*]]
309; CHECK:       bb13:
310; CHECK-NEXT:    invoke void @bar()
311; CHECK-NEXT:            to label [[BB14:%.*]] unwind label [[BB30:%.*]]
312; CHECK:       bb14:
313; CHECK-NEXT:    [[TMP15:%.*]] = load ptr, ptr undef, align 8
314; CHECK-NEXT:    [[TMP16:%.*]] = invoke i32 [[TMP15]](ptr nonnull undef)
315; CHECK-NEXT:            to label [[BB26:%.*]] unwind label [[BB30_THREAD:%.*]]
316; CHECK:       bb17:
317; CHECK-NEXT:    [[TMP18:%.*]] = landingpad { ptr, i32 }
318; CHECK-NEXT:            catch ptr @global.1
319; CHECK-NEXT:            catch ptr null
320; CHECK-NEXT:    unreachable
321; CHECK:       bb19:
322; CHECK-NEXT:    [[TMP20:%.*]] = landingpad { ptr, i32 }
323; CHECK-NEXT:            catch ptr @global.1
324; CHECK-NEXT:            catch ptr null
325; CHECK-NEXT:    unreachable
326; CHECK:       bb21:
327; CHECK-NEXT:    [[TMP22:%.*]] = landingpad { ptr, i32 }
328; CHECK-NEXT:            catch ptr @global.1
329; CHECK-NEXT:            catch ptr null
330; CHECK-NEXT:    unreachable
331; CHECK:       bb26:
332; CHECK-NEXT:    [[TMP27:%.*]] = load ptr, ptr undef, align 8
333; CHECK-NEXT:    [[TMP28:%.*]] = invoke i32 [[TMP27]](ptr nonnull undef)
334; CHECK-NEXT:            to label [[BB29:%.*]] unwind label [[BB30_THREAD]]
335; CHECK:       bb29:
336; CHECK-NEXT:    unreachable
337; CHECK:       bb30.thread:
338; CHECK-NEXT:    [[LPAD_THR_COMM:%.*]] = landingpad { ptr, i32 }
339; CHECK-NEXT:            catch ptr @global.1
340; CHECK-NEXT:            catch ptr null
341; CHECK-NEXT:    br label [[BB32:%.*]]
342; CHECK:       bb30:
343; CHECK-NEXT:    [[LPAD_THR_COMM_SPLIT_LP:%.*]] = landingpad { ptr, i32 }
344; CHECK-NEXT:            catch ptr @global.1
345; CHECK-NEXT:            catch ptr null
346; CHECK-NEXT:    br label [[BB32]]
347; CHECK:       bb32:
348; CHECK-NEXT:    unreachable
349;
350bb:
351  invoke void @bar()
352  to label %bb1 unwind label %bb3
353
354bb1:
355  invoke void @bar()
356  to label %bb2 unwind label %bb4
357
358bb2:
359  invoke void @bar()
360  to label %bb6 unwind label %bb17
361
362bb3:
363  %tmp = landingpad { ptr, i32 }
364  catch ptr @global.1
365  catch ptr null
366  unreachable
367
368bb4:
369  %tmp5 = landingpad { ptr, i32 }
370  catch ptr @global.1
371  catch ptr null
372  unreachable
373
374bb6:
375  invoke void @bar()
376  to label %bb7 unwind label %bb19
377
378bb7:
379  invoke void @bar()
380  to label %bb10 unwind label %bb8
381
382bb8:
383  %tmp9 = landingpad { ptr, i32 }
384  cleanup
385  catch ptr @global.1
386  catch ptr null
387  unreachable
388
389bb10:
390  %tmp11 = load ptr, ptr undef, align 8
391  %tmp12 = invoke i32 %tmp11(ptr nonnull undef)
392  to label %bb13 unwind label %bb21
393
394bb13:
395  invoke void @bar()
396  to label %bb14 unwind label %bb23
397
398bb14:
399  %tmp15 = load ptr, ptr undef, align 8
400  %tmp16 = invoke i32 %tmp15(ptr nonnull undef)
401  to label %bb26 unwind label %bb23
402
403bb17:
404  %tmp18 = landingpad { ptr, i32 }
405  catch ptr @global.1
406  catch ptr null
407  unreachable
408
409bb19:
410  %tmp20 = landingpad { ptr, i32 }
411  catch ptr @global.1
412  catch ptr null
413  unreachable
414
415bb21:
416  %tmp22 = landingpad { ptr, i32 }
417  catch ptr @global.1
418  catch ptr null
419  unreachable
420
421bb23:
422  %tmp24 = phi ptr [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ]
423  %tmp25 = landingpad { ptr, i32 }
424  catch ptr @global.1
425  catch ptr null
426  br label %bb30
427
428bb26:
429  %tmp27 = load ptr, ptr undef, align 8
430  %tmp28 = invoke i32 %tmp27(ptr nonnull undef)
431  to label %bb29 unwind label %bb23
432
433bb29:
434  unreachable
435
436bb30:
437  %tmp31 = icmp eq ptr %tmp24, null
438  br i1 %tmp31, label %bb32, label %bb29
439
440bb32:
441  unreachable
442}
443
444declare void @bar()
445