[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / SimplifyCFG / sink-common-code.ll
blob12a3e59cd3776014a2d9ebe26082f8bafdb514bf
1 ; 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
4 define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
5 entry:
6   br i1 %flag, label %if.then, label %if.else
8 ; CHECK-LABEL: test1
9 ; CHECK: add
10 ; CHECK: select
11 ; CHECK: icmp
12 ; CHECK-NOT: br
13 if.then:
14   %cmp = icmp uge i32 %blksA, %nblks
15   %frombool1 = zext i1 %cmp to i8
16   br label %if.end
18 if.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
24 if.end:
25   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
26   %tobool4 = icmp ne i8 %obeys.0, 0
27   ret i1 %tobool4
30 define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
31 entry:
32   br i1 %flag, label %if.then, label %if.else
34 ; CHECK-LABEL: test2
35 ; CHECK: add
36 ; CHECK: select
37 ; CHECK: icmp
38 ; CHECK-NOT: br
39 if.then:
40   %cmp = icmp uge i32 %blksA, %nblks
41   %frombool1 = zext i1 %cmp to i8
42   br label %if.end
44 if.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
50 if.end:
51   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
52   %tobool4 = icmp ne i8 %obeys.0, 0
53   ret i1 %tobool4
56 declare i32 @foo(i32, i32) nounwind readnone
58 define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) {
59 entry:
60   br i1 %flag, label %if.then, label %if.else
62 if.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
67 if.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
72 if.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
79 ; CHECK-LABEL: test3
80 ; CHECK: select
81 ; CHECK: call
82 ; CHECK: call
83 ; CHECK: add
84 ; CHECK-NOT: br
86 define i32 @test4(i1 zeroext %flag, i32 %x, i32* %y) {
87 entry:
88   br i1 %flag, label %if.then, label %if.else
90 if.then:
91   %a = add i32 %x, 5
92   store i32 %a, i32* %y
93   br label %if.end
95 if.else:
96   %b = add i32 %x, 7
97   store i32 %b, i32* %y
98   br label %if.end
100 if.end:
101   ret i32 1
104 ; CHECK-LABEL: test4
105 ; CHECK: select
106 ; CHECK: store
107 ; CHECK-NOT: store
109 define i32 @test5(i1 zeroext %flag, i32 %x, i32* %y) {
110 entry:
111   br i1 %flag, label %if.then, label %if.else
113 if.then:
114   %a = add i32 %x, 5
115   store volatile i32 %a, i32* %y
116   br label %if.end
118 if.else:
119   %b = add i32 %x, 7
120   store i32 %b, i32* %y
121   br label %if.end
123 if.end:
124   ret i32 1
127 ; CHECK-LABEL: test5
128 ; CHECK: store volatile
129 ; CHECK: store
131 define i32 @test6(i1 zeroext %flag, i32 %x, i32* %y) {
132 entry:
133   br i1 %flag, label %if.then, label %if.else
135 if.then:
136   %a = add i32 %x, 5
137   store volatile i32 %a, i32* %y
138   br label %if.end
140 if.else:
141   %b = add i32 %x, 7
142   store volatile i32 %b, i32* %y
143   br label %if.end
145 if.end:
146   ret i32 1
149 ; CHECK-LABEL: test6
150 ; CHECK: select
151 ; CHECK: store volatile
152 ; CHECK-NOT: store
154 define i32 @test7(i1 zeroext %flag, i32 %x, i32* %y) {
155 entry:
156   br i1 %flag, label %if.then, label %if.else
158 if.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
164 if.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
170 if.end:
171   ret i32 1
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
181 ; %z and %w are in different blocks. We shouldn't sink the add because
182 ; there may be intervening memory instructions.
183 define i32 @test8(i1 zeroext %flag, i32 %x, i32* %y) {
184 entry:
185   %z = load volatile i32, i32* %y
186   br i1 %flag, label %if.then, label %if.else
188 if.then:
189   %a = add i32 %z, 5
190   store volatile i32 %a, i32* %y
191   br label %if.end
193 if.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
199 if.end:
200   ret i32 1
203 ; CHECK-LABEL: test8
204 ; CHECK: add
205 ; CHECK: add
207 ; The extra store in %if.then means %z and %w are not equivalent.
208 define i32 @test9(i1 zeroext %flag, i32 %x, i32* %y, i32* %p) {
209 entry:
210   br i1 %flag, label %if.then, label %if.else
212 if.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
220 if.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
226 if.end:
227   ret i32 1
230 ; CHECK-LABEL: test9
231 ; CHECK: add
232 ; CHECK: add
234 %struct.anon = type { i32, i32 }
236 ; The GEP indexes a struct type so cannot have a variable last index.
237 define i32 @test10(i1 zeroext %flag, i32 %x, i32* %y, %struct.anon* %s) {
238 entry:
239   br i1 %flag, label %if.then, label %if.else
241 if.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
247 if.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
253 if.end:
254   ret i32 1
257 ; CHECK-LABEL: test10
258 ; CHECK: getelementptr
259 ; CHECK: getelementptr
260 ; CHECK: phi
261 ; CHECK: store volatile
263 ; The shufflevector's mask operand cannot be merged in a PHI.
264 define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) {
265 entry:
266   br i1 %flag, label %if.then, label %if.else
268 if.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
273 if.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
278 if.end:
279   %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ]
280   ret i32 1
283 ; CHECK-LABEL: test11
284 ; CHECK: shufflevector
285 ; CHECK: shufflevector
287 ; We can't common an intrinsic!
288 define i32 @test12(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
289 entry:
290   br i1 %flag, label %if.then, label %if.else
292 if.then:
293   %dummy = add i32 %w, 5
294   %sv1 = call i32 @llvm.ctlz.i32(i32 %x)
295   br label %if.end
297 if.else:
298   %dummy1 = add i32 %w, 6
299   %sv2 = call i32 @llvm.cttz.i32(i32 %x)
300   br label %if.end
302 if.end:
303   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
304   ret i32 1
307 declare i32 @llvm.ctlz.i32(i32 %x) readnone
308 declare i32 @llvm.cttz.i32(i32 %x) readnone
310 ; CHECK-LABEL: test12
311 ; CHECK: call i32 @llvm.ctlz
312 ; CHECK: call i32 @llvm.cttz
314 ; The TBAA metadata should be properly combined.
315 define i32 @test13(i1 zeroext %flag, i32 %x, i32* %y) {
316 entry:
317   br i1 %flag, label %if.then, label %if.else
319 if.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
325 if.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
331 if.end:
332   ret i32 1
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 }
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
348 ; The call should be commoned.
349 define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
350 entry:
351   br i1 %flag, label %if.then, label %if.else
353 if.then:
354   %sv1 = call i32 @bar(i32 %x)
355   br label %if.end
357 if.else:
358   %sv2 = call i32 @bar(i32 %y)
359   br label %if.end
361 if.end:
362   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
363   ret i32 1
365 declare i32 @bar(i32)
367 ; CHECK-LABEL: test13a
368 ; CHECK: %[[x:.*]] = select i1 %flag
369 ; CHECK: call i32 @bar(i32 %[[x]])
371 ; The load should be commoned.
372 define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
373 entry:
374   br i1 %flag, label %if.then, label %if.else
376 if.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
383 if.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
391 if.end:
392   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
393   ret i32 1
396 declare void @llvm.dbg.value(metadata, metadata, metadata)
397 !llvm.module.flags = !{!5, !6}
398 !llvm.dbg.cu = !{!7}
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)
408 ; CHECK-LABEL: test14
409 ; CHECK: getelementptr
410 ; CHECK: load
411 ; CHECK-NOT: load
413 ; The load should be commoned.
414 define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
415 entry:
416   br i1 %flag, label %if.then, label %if.else
418 if.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
426 if.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
434 if.end:
435   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
436   ret i32 1
439 ; CHECK-LABEL: test15
440 ; CHECK: getelementptr
441 ; CHECK: load
442 ; CHECK-NOT: load
444 define zeroext i1 @test_crash(i1 zeroext %flag, i32* %i4, i32* %m, i32* %n) {
445 entry:
446   br i1 %flag, label %if.then, label %if.else
448 if.then:
449   %tmp1 = load i32, i32* %i4
450   %tmp2 = add i32 %tmp1, -1
451   store i32 %tmp2, i32* %i4
452   br label %if.end
454 if.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
461 if.end:
462   ret i1 true
465 ; CHECK-LABEL: test_crash
466 ; No checks for test_crash - just ensure it doesn't crash!
468 define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
470 entry:
471   br i1 %flag, label %if.then, label %if.else
473 if.then:
474   %cmp = icmp uge i32 %blksA, %nblks
475   %frombool1 = zext i1 %cmp to i8
476   br label %if.end
478 if.else:
479   br i1 %flag2, label %if.then2, label %if.end
481 if.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
487 if.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
493 ; CHECK-LABEL: test16
494 ; CHECK: zext
495 ; CHECK: zext
497 define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, i8* %p) {
499 entry:
500   br i1 %flag, label %if.then, label %if.else
502 if.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
508 if.else:
509   br i1 %flag2, label %if.then2, label %if.end
511 if.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
518 if.end:
519   ret i1 true
522 ; CHECK-LABEL: test16a
523 ; CHECK: zext
524 ; CHECK-NOT: zext
526 define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
527 entry:
528   switch i32 %flag, label %if.end [
529     i32 0, label %if.then
530     i32 1, label %if.then2
531   ]
533 if.then:
534   %cmp = icmp uge i32 %blksA, %nblks
535   %frombool1 = call i8 @i1toi8(i1 %cmp)
536   br label %if.end
538 if.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
544 if.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
549 declare i8 @i1toi8(i1)
551 ; CHECK-LABEL: test17
552 ; CHECK: if.then:
553 ; CHECK-NEXT: icmp uge
554 ; CHECK-NEXT: br label %[[x:.*]]
556 ; CHECK: if.then2:
557 ; CHECK-NEXT: add
558 ; CHECK-NEXT: icmp ule
559 ; CHECK-NEXT: br label %[[x]]
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
566 ; CHECK: if.end:
567 ; CHECK-NEXT: phi i8
568 ; CHECK-DAG: [ %[[z]], %[[x]] ]
569 ; CHECK-DAG: [ 0, %entry ]
571 define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
572 entry:
573   switch i32 %flag, label %if.then3 [
574     i32 0, label %if.then
575     i32 1, label %if.then2
576   ]
578 if.then:
579   %cmp = icmp uge i32 %blksA, %nblks
580   %frombool1 = zext i1 %cmp to i8
581   br label %if.end
583 if.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
589 if.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
595 if.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
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
609 define i32 @test_pr30188(i1 zeroext %flag, i32 %x) {
610 entry:
611   %y = alloca i32
612   %z = alloca i32
613   br i1 %flag, label %if.then, label %if.else
615 if.then:
616   store i32 %x, i32* %y
617   br label %if.end
619 if.else:
620   store i32 %x, i32* %z
621   br label %if.end
623 if.end:
624   ret i32 1
627 ; CHECK-LABEL: test_pr30188
628 ; CHECK-NOT: select
629 ; CHECK: store
630 ; CHECK: store
632 define i32 @test_pr30188a(i1 zeroext %flag, i32 %x) {
633 entry:
634   %y = alloca i32
635   %z = alloca i32
636   br i1 %flag, label %if.then, label %if.else
638 if.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
645 if.else:
646   %three = load i32, i32* %z
647   %four = add i32 %three, 2
648   store i32 %four, i32* %y
649   br label %if.end
651 if.end:
652   ret i32 1
655 ; CHECK-LABEL: test_pr30188a
656 ; CHECK-NOT: select
657 ; CHECK: load
658 ; CHECK: load
659 ; CHECK: store
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.
664 define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) {
665 entry:
666   %add1 = add i32 %a, 1
667   br label %succ
669 one:
670   br i1 %cond, label %two, label %succ
672 two:
673   call void @g()
674   %add2 = add i32 %a, 1
675   br label %succ
677 succ:
678   %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ]
679   br label %one
681 declare void @g()
683 ; CHECK-LABEL: test_pr30292
684 ; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ]
686 define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
688 entry:
689   %p = alloca i8
690   br i1 %flag, label %if.then, label %if.else
692 if.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
698 if.else:
699   br i1 %flag2, label %if.then2, label %if.end
701 if.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
708 if.end:
709   ret i1 true
712 ; CHECK-LABEL: @test_pr30244
713 ; CHECK: store
714 ; CHECK: store
716 define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) {
717 entry:
718   br i1 %flag, label %if.then, label %if.else
720 if.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
726 if.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
732 if.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
739 ; CHECK-LABEL: test_pr30373a
740 ; CHECK: lshr
741 ; CHECK-NOT: exact
742 ; CHECK: }
744 define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) {
745 entry:
746   br i1 %flag, label %if.then, label %if.else
748 if.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
754 if.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
760 if.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
767 ; CHECK-LABEL: test_pr30373b
768 ; CHECK: lshr
769 ; CHECK-NOT: exact
770 ; CHECK: }
772 ; Check that simplifycfg doesn't sink and merge inline-asm instructions.
774 define i32 @test_inline_asm1(i32 %c, i32 %r6) {
775 entry:
776   %tobool = icmp eq i32 %c, 0
777   br i1 %tobool, label %if.else, label %if.then
779 if.then:
780   %0 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 8)
781   br label %if.end
783 if.else:
784   %1 = call i32 asm "rorl $2, $0", "=&r,0,n,~{dirflag},~{fpsr},~{flags}"(i32 %r6, i32 6)
785   br label %if.end
787 if.end:
788   %r6.addr.0 = phi i32 [ %0, %if.then ], [ %1, %if.else ]
789   ret i32 %r6.addr.0
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)
796 declare i32 @call_target()
798 define void @test_operand_bundles(i1 %cond, i32* %ptr) {
799 entry:
800   br i1 %cond, label %left, label %right
802 left:
803   %val0 = call i32 @call_target() [ "deopt"(i32 10) ]
804   store i32 %val0, i32* %ptr
805   br label %merge
807 right:
808   %val1 = call i32 @call_target() [ "deopt"(i32 20) ]
809   store i32 %val1, i32* %ptr
810   br label %merge
812 merge:
813   ret void
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) ]
822 %T = type {i32, i32}
824 define i32 @test_insertvalue(i1 zeroext %flag, %T %P) {
825 entry:
826   br i1 %flag, label %if.then, label %if.else
828 if.then:
829   %t1 = insertvalue %T %P, i32 0, 0
830   br label %if.end
832 if.else:
833   %t2 = insertvalue %T %P, i32 1, 0
834   br label %if.end
836 if.end:
837   %t = phi %T [%t1, %if.then], [%t2, %if.else]
838   ret i32 1
841 ; CHECK-LABEL: @test_insertvalue
842 ; CHECK: select
843 ; CHECK: insertvalue
844 ; CHECK-NOT: insertvalue
847 declare void @baz(i32)
849 define void @test_sink_void_calls(i32 %x) {
850 entry:
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   ]
858 bb0:
859   call void @baz(i32 12)
860   br label %return
861 bb1:
862   call void @baz(i32 34)
863   br label %return
864 bb2:
865   call void @baz(i32 56)
866   br label %return
867 bb3:
868   call void @baz(i32 78)
869   br label %return
870 bb4:
871   call void @baz(i32 90)
872   br label %return
873 default:
874   unreachable
875 return:
876   ret void
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
890 ; CHECK: ![[$TBAA]] = !{![[TYPE:[0-9]]], ![[TYPE]], i64 0}
891 ; CHECK: ![[TYPE]] = !{!"float", ![[TEXT:[0-9]]]}
892 ; CHECK: ![[TEXT]] = !{!"an example type tree"}