blob: 12a3e59cd3776014a2d9ebe26082f8bafdb514bf [file] [log] [blame]
Eric Christophercee313d2019-04-17 04:52:47 +00001; RUN: opt < %s -simplifycfg -sink-common-insts -S | FileCheck -enable-var-scope %s
2; RUN: opt < %s -passes='simplify-cfg<sink-common-insts>' -S | FileCheck -enable-var-scope %s
3
4define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
5entry:
6 br i1 %flag, label %if.then, label %if.else
7
8; CHECK-LABEL: test1
9; CHECK: add
10; CHECK: select
11; CHECK: icmp
12; CHECK-NOT: br
13if.then:
14 %cmp = icmp uge i32 %blksA, %nblks
15 %frombool1 = zext i1 %cmp to i8
16 br label %if.end
17
18if.else:
19 %add = add i32 %nblks, %blksB
20 %cmp2 = icmp ule i32 %add, %blksA
21 %frombool3 = zext i1 %cmp2 to i8
22 br label %if.end
23
24if.end:
25 %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
26 %tobool4 = icmp ne i8 %obeys.0, 0
27 ret i1 %tobool4
28}
29
30define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
31entry:
32 br i1 %flag, label %if.then, label %if.else
33
34; CHECK-LABEL: test2
35; CHECK: add
36; CHECK: select
37; CHECK: icmp
38; CHECK-NOT: br
39if.then:
40 %cmp = icmp uge i32 %blksA, %nblks
41 %frombool1 = zext i1 %cmp to i8
42 br label %if.end
43
44if.else:
45 %add = add i32 %nblks, %blksB
46 %cmp2 = icmp uge i32 %blksA, %add
47 %frombool3 = zext i1 %cmp2 to i8
48 br label %if.end
49
50if.end:
51 %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
52 %tobool4 = icmp ne i8 %obeys.0, 0
53 ret i1 %tobool4
54}
55
56declare i32 @foo(i32, i32) nounwind readnone
57
58define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) {
59entry:
60 br i1 %flag, label %if.then, label %if.else
61
62if.then:
63 %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
64 %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
65 br label %if.end
66
67if.else:
68 %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
69 %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
70 br label %if.end
71
72if.end:
73 %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
74 %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ]
75 %ret = add i32 %xx, %yy
76 ret i32 %ret
77}
78
79; CHECK-LABEL: test3
80; CHECK: select
81; CHECK: call
82; CHECK: call
83; CHECK: add
84; CHECK-NOT: br
85
86define i32 @test4(i1 zeroext %flag, i32 %x, i32* %y) {
87entry:
88 br i1 %flag, label %if.then, label %if.else
89
90if.then:
91 %a = add i32 %x, 5
92 store i32 %a, i32* %y
93 br label %if.end
94
95if.else:
96 %b = add i32 %x, 7
97 store i32 %b, i32* %y
98 br label %if.end
99
100if.end:
101 ret i32 1
102}
103
104; CHECK-LABEL: test4
105; CHECK: select
106; CHECK: store
107; CHECK-NOT: store
108
109define i32 @test5(i1 zeroext %flag, i32 %x, i32* %y) {
110entry:
111 br i1 %flag, label %if.then, label %if.else
112
113if.then:
114 %a = add i32 %x, 5
115 store volatile i32 %a, i32* %y
116 br label %if.end
117
118if.else:
119 %b = add i32 %x, 7
120 store i32 %b, i32* %y
121 br label %if.end
122
123if.end:
124 ret i32 1
125}
126
127; CHECK-LABEL: test5
128; CHECK: store volatile
129; CHECK: store
130
131define i32 @test6(i1 zeroext %flag, i32 %x, i32* %y) {
132entry:
133 br i1 %flag, label %if.then, label %if.else
134
135if.then:
136 %a = add i32 %x, 5
137 store volatile i32 %a, i32* %y
138 br label %if.end
139
140if.else:
141 %b = add i32 %x, 7
142 store volatile i32 %b, i32* %y
143 br label %if.end
144
145if.end:
146 ret i32 1
147}
148
149; CHECK-LABEL: test6
150; CHECK: select
151; CHECK: store volatile
152; CHECK-NOT: store
153
154define i32 @test7(i1 zeroext %flag, i32 %x, i32* %y) {
155entry:
156 br i1 %flag, label %if.then, label %if.else
157
158if.then:
159 %z = load volatile i32, i32* %y
160 %a = add i32 %z, 5
161 store volatile i32 %a, i32* %y
162 br label %if.end
163
164if.else:
165 %w = load volatile i32, i32* %y
166 %b = add i32 %w, 7
167 store volatile i32 %b, i32* %y
168 br label %if.end
169
170if.end:
171 ret i32 1
172}
173
174; CHECK-LABEL: test7
175; CHECK-DAG: select
176; CHECK-DAG: load volatile
177; CHECK: store volatile
178; CHECK-NOT: load
179; CHECK-NOT: store
180
181; %z and %w are in different blocks. We shouldn't sink the add because
182; there may be intervening memory instructions.
183define i32 @test8(i1 zeroext %flag, i32 %x, i32* %y) {
184entry:
185 %z = load volatile i32, i32* %y
186 br i1 %flag, label %if.then, label %if.else
187
188if.then:
189 %a = add i32 %z, 5
190 store volatile i32 %a, i32* %y
191 br label %if.end
192
193if.else:
194 %w = load volatile i32, i32* %y
195 %b = add i32 %w, 7
196 store volatile i32 %b, i32* %y
197 br label %if.end
198
199if.end:
200 ret i32 1
201}
202
203; CHECK-LABEL: test8
204; CHECK: add
205; CHECK: add
206
207; The extra store in %if.then means %z and %w are not equivalent.
208define i32 @test9(i1 zeroext %flag, i32 %x, i32* %y, i32* %p) {
209entry:
210 br i1 %flag, label %if.then, label %if.else
211
212if.then:
213 store i32 7, i32* %p
214 %z = load volatile i32, i32* %y
215 store i32 6, i32* %p
216 %a = add i32 %z, 5
217 store volatile i32 %a, i32* %y
218 br label %if.end
219
220if.else:
221 %w = load volatile i32, i32* %y
222 %b = add i32 %w, 7
223 store volatile i32 %b, i32* %y
224 br label %if.end
225
226if.end:
227 ret i32 1
228}
229
230; CHECK-LABEL: test9
231; CHECK: add
232; CHECK: add
233
234%struct.anon = type { i32, i32 }
235
236; The GEP indexes a struct type so cannot have a variable last index.
237define i32 @test10(i1 zeroext %flag, i32 %x, i32* %y, %struct.anon* %s) {
238entry:
239 br i1 %flag, label %if.then, label %if.else
240
241if.then:
242 %dummy = add i32 %x, 5
243 %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
244 store volatile i32 %x, i32* %gepa
245 br label %if.end
246
247if.else:
248 %dummy1 = add i32 %x, 6
249 %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
250 store volatile i32 %x, i32* %gepb
251 br label %if.end
252
253if.end:
254 ret i32 1
255}
256
257; CHECK-LABEL: test10
258; CHECK: getelementptr
259; CHECK: getelementptr
260; CHECK: phi
261; CHECK: store volatile
262
263; The shufflevector's mask operand cannot be merged in a PHI.
264define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) {
265entry:
266 br i1 %flag, label %if.then, label %if.else
267
268if.then:
269 %dummy = add i32 %w, 5
270 %sv1 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 0, i32 1>
271 br label %if.end
272
273if.else:
274 %dummy1 = add i32 %w, 6
275 %sv2 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 1, i32 0>
276 br label %if.end
277
278if.end:
279 %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ]
280 ret i32 1
281}
282
283; CHECK-LABEL: test11
284; CHECK: shufflevector
285; CHECK: shufflevector
286
287; We can't common an intrinsic!
288define i32 @test12(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
289entry:
290 br i1 %flag, label %if.then, label %if.else
291
292if.then:
293 %dummy = add i32 %w, 5
294 %sv1 = call i32 @llvm.ctlz.i32(i32 %x)
295 br label %if.end
296
297if.else:
298 %dummy1 = add i32 %w, 6
299 %sv2 = call i32 @llvm.cttz.i32(i32 %x)
300 br label %if.end
301
302if.end:
303 %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
304 ret i32 1
305}
306
307declare i32 @llvm.ctlz.i32(i32 %x) readnone
308declare i32 @llvm.cttz.i32(i32 %x) readnone
309
310; CHECK-LABEL: test12
311; CHECK: call i32 @llvm.ctlz
312; CHECK: call i32 @llvm.cttz
313
314; The TBAA metadata should be properly combined.
315define i32 @test13(i1 zeroext %flag, i32 %x, i32* %y) {
316entry:
317 br i1 %flag, label %if.then, label %if.else
318
319if.then:
320 %z = load volatile i32, i32* %y
321 %a = add i32 %z, 5
322 store volatile i32 %a, i32* %y, !tbaa !3
323 br label %if.end
324
325if.else:
326 %w = load volatile i32, i32* %y
327 %b = add i32 %w, 7
328 store volatile i32 %b, i32* %y, !tbaa !4
329 br label %if.end
330
331if.end:
332 ret i32 1
333}
334
335!0 = !{ !"an example type tree" }
336!1 = !{ !"int", !0 }
337!2 = !{ !"float", !0 }
338!3 = !{ !"const float", !2, i64 0 }
339!4 = !{ !"special float", !2, i64 1 }
340
341; CHECK-LABEL: test13
342; CHECK-DAG: select
343; CHECK-DAG: load volatile
344; CHECK: store volatile {{.*}}, !tbaa ![[$TBAA:[0-9]]]
345; CHECK-NOT: load
346; CHECK-NOT: store
347
348; The call should be commoned.
349define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
350entry:
351 br i1 %flag, label %if.then, label %if.else
352
353if.then:
354 %sv1 = call i32 @bar(i32 %x)
355 br label %if.end
356
357if.else:
358 %sv2 = call i32 @bar(i32 %y)
359 br label %if.end
360
361if.end:
362 %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
363 ret i32 1
364}
365declare i32 @bar(i32)
366
367; CHECK-LABEL: test13a
368; CHECK: %[[x:.*]] = select i1 %flag
369; CHECK: call i32 @bar(i32 %[[x]])
370
371; The load should be commoned.
372define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
373entry:
374 br i1 %flag, label %if.then, label %if.else
375
376if.then:
377 %dummy = add i32 %x, 1
378 %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
379 %sv1 = load i32, i32* %gepa
380 %cmp1 = icmp eq i32 %sv1, 56
381 br label %if.end
382
383if.else:
384 %dummy2 = add i32 %x, 4
385 %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
386 %sv2 = load i32, i32* %gepb
387 %cmp2 = icmp eq i32 %sv2, 57
388 call void @llvm.dbg.value(metadata i32 0, metadata !9, metadata !DIExpression()), !dbg !11
389 br label %if.end
390
391if.end:
392 %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
393 ret i32 1
394}
395
396declare void @llvm.dbg.value(metadata, metadata, metadata)
397!llvm.module.flags = !{!5, !6}
398!llvm.dbg.cu = !{!7}
399
400!5 = !{i32 2, !"Dwarf Version", i32 4}
401!6 = !{i32 2, !"Debug Info Version", i32 3}
402!7 = distinct !DICompileUnit(language: DW_LANG_C99, file: !10)
403!8 = distinct !DISubprogram(name: "foo", unit: !7)
404!9 = !DILocalVariable(name: "b", line: 1, arg: 2, scope: !8)
405!10 = !DIFile(filename: "a.c", directory: "a/b")
406!11 = !DILocation(line: 1, column: 14, scope: !8)
407
408; CHECK-LABEL: test14
409; CHECK: getelementptr
410; CHECK: load
411; CHECK-NOT: load
412
413; The load should be commoned.
414define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
415entry:
416 br i1 %flag, label %if.then, label %if.else
417
418if.then:
419 %dummy = add i32 %x, 1
420 %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
421 %sv1 = load i32, i32* %gepa
422 %ext1 = zext i32 %sv1 to i64
423 %cmp1 = icmp eq i64 %ext1, 56
424 br label %if.end
425
426if.else:
427 %dummy2 = add i32 %x, 4
428 %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
429 %sv2 = load i32, i32* %gepb
430 %ext2 = zext i32 %sv2 to i64
431 %cmp2 = icmp eq i64 %ext2, 57
432 br label %if.end
433
434if.end:
435 %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
436 ret i32 1
437}
438
439; CHECK-LABEL: test15
440; CHECK: getelementptr
441; CHECK: load
442; CHECK-NOT: load
443
444define zeroext i1 @test_crash(i1 zeroext %flag, i32* %i4, i32* %m, i32* %n) {
445entry:
446 br i1 %flag, label %if.then, label %if.else
447
448if.then:
449 %tmp1 = load i32, i32* %i4
450 %tmp2 = add i32 %tmp1, -1
451 store i32 %tmp2, i32* %i4
452 br label %if.end
453
454if.else:
455 %tmp3 = load i32, i32* %m
456 %tmp4 = load i32, i32* %n
457 %tmp5 = add i32 %tmp3, %tmp4
458 store i32 %tmp5, i32* %i4
459 br label %if.end
460
461if.end:
462 ret i1 true
463}
464
465; CHECK-LABEL: test_crash
466; No checks for test_crash - just ensure it doesn't crash!
467
468define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
469
470entry:
471 br i1 %flag, label %if.then, label %if.else
472
473if.then:
474 %cmp = icmp uge i32 %blksA, %nblks
475 %frombool1 = zext i1 %cmp to i8
476 br label %if.end
477
478if.else:
479 br i1 %flag2, label %if.then2, label %if.end
480
481if.then2:
482 %add = add i32 %nblks, %blksB
483 %cmp2 = icmp ule i32 %add, %blksA
484 %frombool3 = zext i1 %cmp2 to i8
485 br label %if.end
486
487if.end:
488 %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %if.else ]
489 %tobool4 = icmp ne i8 %obeys.0, 0
490 ret i1 %tobool4
491}
492
493; CHECK-LABEL: test16
494; CHECK: zext
495; CHECK: zext
496
497define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, i8* %p) {
498
499entry:
500 br i1 %flag, label %if.then, label %if.else
501
502if.then:
503 %cmp = icmp uge i32 %blksA, %nblks
504 %frombool1 = zext i1 %cmp to i8
505 store i8 %frombool1, i8* %p
506 br label %if.end
507
508if.else:
509 br i1 %flag2, label %if.then2, label %if.end
510
511if.then2:
512 %add = add i32 %nblks, %blksB
513 %cmp2 = icmp ule i32 %add, %blksA
514 %frombool3 = zext i1 %cmp2 to i8
515 store i8 %frombool3, i8* %p
516 br label %if.end
517
518if.end:
519 ret i1 true
520}
521
522; CHECK-LABEL: test16a
523; CHECK: zext
524; CHECK-NOT: zext
525
526define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
527entry:
528 switch i32 %flag, label %if.end [
529 i32 0, label %if.then
530 i32 1, label %if.then2
531 ]
532
533if.then:
534 %cmp = icmp uge i32 %blksA, %nblks
535 %frombool1 = call i8 @i1toi8(i1 %cmp)
536 br label %if.end
537
538if.then2:
539 %add = add i32 %nblks, %blksB
540 %cmp2 = icmp ule i32 %add, %blksA
541 %frombool3 = call i8 @i1toi8(i1 %cmp2)
542 br label %if.end
543
544if.end:
545 %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %entry ]
546 %tobool4 = icmp ne i8 %obeys.0, 0
547 ret i1 %tobool4
548}
549declare i8 @i1toi8(i1)
550
551; CHECK-LABEL: test17
552; CHECK: if.then:
553; CHECK-NEXT: icmp uge
554; CHECK-NEXT: br label %[[x:.*]]
555
556; CHECK: if.then2:
557; CHECK-NEXT: add
558; CHECK-NEXT: icmp ule
559; CHECK-NEXT: br label %[[x]]
560
561; CHECK: [[x]]:
562; CHECK-NEXT: %[[y:.*]] = phi i1 [ %cmp
563; CHECK-NEXT: %[[z:.*]] = call i8 @i1toi8(i1 %[[y]])
564; CHECK-NEXT: br label %if.end
565
566; CHECK: if.end:
567; CHECK-NEXT: phi i8
568; CHECK-DAG: [ %[[z]], %[[x]] ]
569; CHECK-DAG: [ 0, %entry ]
570
571define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
572entry:
573 switch i32 %flag, label %if.then3 [
574 i32 0, label %if.then
575 i32 1, label %if.then2
576 ]
577
578if.then:
579 %cmp = icmp uge i32 %blksA, %nblks
580 %frombool1 = zext i1 %cmp to i8
581 br label %if.end
582
583if.then2:
584 %add = add i32 %nblks, %blksB
585 %cmp2 = icmp ule i32 %add, %blksA
586 %frombool3 = zext i1 %cmp2 to i8
587 br label %if.end
588
589if.then3:
590 %add2 = add i32 %nblks, %blksA
591 %cmp3 = icmp ule i32 %add2, %blksA
592 %frombool4 = zext i1 %cmp3 to i8
593 br label %if.end
594
595if.end:
596 %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ %frombool4, %if.then3 ]
597 %tobool4 = icmp ne i8 %obeys.0, 0
598 ret i1 %tobool4
599}
600
601; CHECK-LABEL: test18
602; CHECK: if.end:
603; CHECK-NEXT: %[[x:.*]] = phi i1
604; CHECK-DAG: [ %cmp, %if.then ]
605; CHECK-DAG: [ %cmp2, %if.then2 ]
606; CHECK-DAG: [ %cmp3, %if.then3 ]
607; CHECK-NEXT: zext i1 %[[x]] to i8
608
609define i32 @test_pr30188(i1 zeroext %flag, i32 %x) {
610entry:
611 %y = alloca i32
612 %z = alloca i32
613 br i1 %flag, label %if.then, label %if.else
614
615if.then:
616 store i32 %x, i32* %y
617 br label %if.end
618
619if.else:
620 store i32 %x, i32* %z
621 br label %if.end
622
623if.end:
624 ret i32 1
625}
626
627; CHECK-LABEL: test_pr30188
628; CHECK-NOT: select
629; CHECK: store
630; CHECK: store
631
632define i32 @test_pr30188a(i1 zeroext %flag, i32 %x) {
633entry:
634 %y = alloca i32
635 %z = alloca i32
636 br i1 %flag, label %if.then, label %if.else
637
638if.then:
639 call void @g()
640 %one = load i32, i32* %y
641 %two = add i32 %one, 2
642 store i32 %two, i32* %y
643 br label %if.end
644
645if.else:
646 %three = load i32, i32* %z
647 %four = add i32 %three, 2
648 store i32 %four, i32* %y
649 br label %if.end
650
651if.end:
652 ret i32 1
653}
654
655; CHECK-LABEL: test_pr30188a
656; CHECK-NOT: select
657; CHECK: load
658; CHECK: load
659; CHECK: store
660
661; The phi is confusing - both add instructions are used by it, but
662; not on their respective unconditional arcs. It should not be
663; optimized.
664define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) {
665entry:
666 %add1 = add i32 %a, 1
667 br label %succ
668
669one:
670 br i1 %cond, label %two, label %succ
671
672two:
673 call void @g()
674 %add2 = add i32 %a, 1
675 br label %succ
676
677succ:
678 %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ]
679 br label %one
680}
681declare void @g()
682
683; CHECK-LABEL: test_pr30292
684; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ]
685
686define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
687
688entry:
689 %p = alloca i8
690 br i1 %flag, label %if.then, label %if.else
691
692if.then:
693 %cmp = icmp uge i32 %blksA, %nblks
694 %frombool1 = zext i1 %cmp to i8
695 store i8 %frombool1, i8* %p
696 br label %if.end
697
698if.else:
699 br i1 %flag2, label %if.then2, label %if.end
700
701if.then2:
702 %add = add i32 %nblks, %blksB
703 %cmp2 = icmp ule i32 %add, %blksA
704 %frombool3 = zext i1 %cmp2 to i8
705 store i8 %frombool3, i8* %p
706 br label %if.end
707
708if.end:
709 ret i1 true
710}
711
712; CHECK-LABEL: @test_pr30244
713; CHECK: store
714; CHECK: store
715
716define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) {
717entry:
718 br i1 %flag, label %if.then, label %if.else
719
720if.then:
721 %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
722 %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
723 %z0 = lshr i32 %y0, 8
724 br label %if.end
725
726if.else:
727 %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
728 %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
729 %z1 = lshr exact i32 %y1, 8
730 br label %if.end
731
732if.end:
733 %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
734 %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
735 %ret = add i32 %xx, %yy
736 ret i32 %ret
737}
738
739; CHECK-LABEL: test_pr30373a
740; CHECK: lshr
741; CHECK-NOT: exact
742; CHECK: }
743
744define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) {
745entry:
746 br i1 %flag, label %if.then, label %if.else
747
748if.then:
749 %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
750 %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
751 %z0 = lshr exact i32 %y0, 8
752 br label %if.end
753
754if.else:
755 %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
756 %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
757 %z1 = lshr i32 %y1, 8
758 br label %if.end
759
760if.end:
761 %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
762 %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
763 %ret = add i32 %xx, %yy
764 ret i32 %ret
765}
766
767; CHECK-LABEL: test_pr30373b
768; CHECK: lshr
769; CHECK-NOT: exact
770; CHECK: }
771
772; Check that simplifycfg doesn't sink and merge inline-asm instructions.
773
774define i32 @test_inline_asm1(i32 %c, i32 %r6) {
775entry:
776 %tobool = icmp eq i32 %c, 0
777 br i1 %tobool, label %if.else, label %if.then
778
779if.then:
780 %0 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8)
781 br label %if.end
782
783if.else:
784 %1 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6)
785 br label %if.end
786
787if.end:
788 %r6.addr.0 = phi i32 [ %0, %if.then ], [ %1, %if.else ]
789 ret i32 %r6.addr.0
790}
791
792; CHECK-LABEL: @test_inline_asm1(
793; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8)
794; CHECK: call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6)
795
796declare i32 @call_target()
797
798define void @test_operand_bundles(i1 %cond, i32* %ptr) {
799entry:
800 br i1 %cond, label %left, label %right
801
802left:
803 %val0 = call i32 @call_target() [ "deopt"(i32 10) ]
804 store i32 %val0, i32* %ptr
805 br label %merge
806
807right:
808 %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
809 store i32 %val1, i32* %ptr
810 br label %merge
811
812merge:
813 ret void
814}
815
816; CHECK-LABEL: @test_operand_bundles(
817; CHECK: left:
818; CHECK-NEXT: %val0 = call i32 @call_target() [ "deopt"(i32 10) ]
819; CHECK: right:
820; CHECK-NEXT: %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
821
822%T = type {i32, i32}
823
824define i32 @test_insertvalue(i1 zeroext %flag, %T %P) {
825entry:
826 br i1 %flag, label %if.then, label %if.else
827
828if.then:
829 %t1 = insertvalue %T %P, i32 0, 0
830 br label %if.end
831
832if.else:
833 %t2 = insertvalue %T %P, i32 1, 0
834 br label %if.end
835
836if.end:
837 %t = phi %T [%t1, %if.then], [%t2, %if.else]
838 ret i32 1
839}
840
841; CHECK-LABEL: @test_insertvalue
842; CHECK: select
843; CHECK: insertvalue
844; CHECK-NOT: insertvalue
845
846
847declare void @baz(i32)
848
849define void @test_sink_void_calls(i32 %x) {
850entry:
851 switch i32 %x, label %default [
852 i32 0, label %bb0
853 i32 1, label %bb1
854 i32 2, label %bb2
855 i32 3, label %bb3
856 i32 4, label %bb4
857 ]
858bb0:
859 call void @baz(i32 12)
860 br label %return
861bb1:
862 call void @baz(i32 34)
863 br label %return
864bb2:
865 call void @baz(i32 56)
866 br label %return
867bb3:
868 call void @baz(i32 78)
869 br label %return
870bb4:
871 call void @baz(i32 90)
872 br label %return
873default:
874 unreachable
875return:
876 ret void
877
878; Check that the calls get sunk to the return block.
879; We would previously not sink calls without uses, see PR41259.
880; CHECK-LABEL: @test_sink_void_calls
881; CHECK-NOT: call
882; CHECK-LABEL: return:
883; CHECK: phi
884; CHECK: call
885; CHECK-NOT: call
886; CHECK: ret
887}
888
889
890; CHECK: ![[$TBAA]] = !{![[TYPE:[0-9]]], ![[TYPE]], i64 0}
891; CHECK: ![[TYPE]] = !{!"float", ![[TEXT:[0-9]]]}
892; CHECK: ![[TEXT]] = !{!"an example type tree"}