[InstCombine] Signed saturation tests. NFC
[llvm-complete.git] / test / Transforms / GVNSink / sink-common-code.ll
blob02b1eb7fe25950bfa7c553a00c5b3c0e306fdf35
1 ; RUN: opt < %s -gvn-sink -simplifycfg -simplifycfg-sink-common=false -S | FileCheck %s
3 define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
4 entry:
5   br i1 %flag, label %if.then, label %if.else
7 ; CHECK-LABEL: test1
8 ; CHECK: add
9 ; CHECK: select
10 ; CHECK: icmp
11 ; CHECK-NOT: br
12 if.then:
13   %cmp = icmp uge i32 %blksA, %nblks
14   %frombool1 = zext i1 %cmp to i8
15   br label %if.end
17 if.else:
18   %add = add i32 %nblks, %blksB
19   %cmp2 = icmp ule i32 %add, %blksA
20   %frombool3 = zext i1 %cmp2 to i8
21   br label %if.end
23 if.end:
24   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
25   %tobool4 = icmp ne i8 %obeys.0, 0
26   ret i1 %tobool4
29 define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
30 entry:
31   br i1 %flag, label %if.then, label %if.else
33 ; CHECK-LABEL: test2
34 ; CHECK: add
35 ; CHECK: select
36 ; CHECK: icmp
37 ; CHECK-NOT: br
38 if.then:
39   %cmp = icmp uge i32 %blksA, %nblks
40   %frombool1 = zext i1 %cmp to i8
41   br label %if.end
43 if.else:
44   %add = add i32 %nblks, %blksB
45   %cmp2 = icmp uge i32 %blksA, %add
46   %frombool3 = zext i1 %cmp2 to i8
47   br label %if.end
49 if.end:
50   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
51   %tobool4 = icmp ne i8 %obeys.0, 0
52   ret i1 %tobool4
55 declare i32 @foo(i32, i32) nounwind readnone
57 ; FIXME: The test failes when the original order of the
58 ; candidates with the same cost is preserved.
60 ;define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) {
61 ;entry:
62 ;  br i1 %flag, label %if.then, label %if.else
64 ;if.then:
65 ;  %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
66 ;  %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
67 ;  br label %if.end
69 ;if.else:
70 ;  %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
71 ;  %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
72 ;  br label %if.end
74 ;if.end:
75 ;  %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
76 ;  %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ]
77 ;  %ret = add i32 %xx, %yy
78 ;  ret i32 %ret
81 ; -CHECK-LABEL: test3
82 ; -CHECK: select
83 ; -CHECK: call
84 ; -CHECK: call
85 ; -CHECK: add
86 ; -CHECK-NOT: br
88 define i32 @test4(i1 zeroext %flag, i32 %x, i32* %y) {
89 entry:
90   br i1 %flag, label %if.then, label %if.else
92 if.then:
93   %a = add i32 %x, 5
94   store i32 %a, i32* %y
95   br label %if.end
97 if.else:
98   %b = add i32 %x, 7
99   store i32 %b, i32* %y
100   br label %if.end
102 if.end:
103   ret i32 1
106 ; CHECK-LABEL: test4
107 ; CHECK: select
108 ; CHECK: store
109 ; CHECK-NOT: store
111 define i32 @test5(i1 zeroext %flag, i32 %x, i32* %y) {
112 entry:
113   br i1 %flag, label %if.then, label %if.else
115 if.then:
116   %a = add i32 %x, 5
117   store volatile i32 %a, i32* %y
118   br label %if.end
120 if.else:
121   %b = add i32 %x, 7
122   store i32 %b, i32* %y
123   br label %if.end
125 if.end:
126   ret i32 1
129 ; CHECK-LABEL: test5
130 ; CHECK: store volatile
131 ; CHECK: store
133 define i32 @test6(i1 zeroext %flag, i32 %x, i32* %y) {
134 entry:
135   br i1 %flag, label %if.then, label %if.else
137 if.then:
138   %a = add i32 %x, 5
139   store volatile i32 %a, i32* %y
140   br label %if.end
142 if.else:
143   %b = add i32 %x, 7
144   store volatile i32 %b, i32* %y
145   br label %if.end
147 if.end:
148   ret i32 1
151 ; CHECK-LABEL: test6
152 ; CHECK: select
153 ; CHECK: store volatile
154 ; CHECK-NOT: store
156 define i32 @test7(i1 zeroext %flag, i32 %x, i32* %y) {
157 entry:
158   br i1 %flag, label %if.then, label %if.else
160 if.then:
161   %z = load volatile i32, i32* %y
162   %a = add i32 %z, 5
163   store volatile i32 %a, i32* %y
164   br label %if.end
166 if.else:
167   %w = load volatile i32, i32* %y
168   %b = add i32 %w, 7
169   store volatile i32 %b, i32* %y
170   br label %if.end
172 if.end:
173   ret i32 1
176 ; CHECK-LABEL: test7
177 ; CHECK-DAG: select
178 ; CHECK-DAG: load volatile
179 ; CHECK: store volatile
180 ; CHECK-NOT: load
181 ; CHECK-NOT: store
183 ; The extra store in %if.then means %z and %w are not equivalent.
184 define i32 @test9(i1 zeroext %flag, i32 %x, i32* %y, i32* %p) {
185 entry:
186   br i1 %flag, label %if.then, label %if.else
188 if.then:
189   store i32 7, i32* %p
190   %z = load volatile i32, i32* %y
191   store i32 6, i32* %p
192   %a = add i32 %z, 5
193   store volatile i32 %a, i32* %y
194   br label %if.end
196 if.else:
197   %w = load volatile i32, i32* %y
198   %b = add i32 %w, 7
199   store volatile i32 %b, i32* %y
200   br label %if.end
202 if.end:
203   ret i32 1
206 ; CHECK-LABEL: test9
207 ; CHECK: add
208 ; CHECK: add
210 %struct.anon = type { i32, i32 }
212 ; The GEP indexes a struct type so cannot have a variable last index.
213 define i32 @test10(i1 zeroext %flag, i32 %x, i32* %y, %struct.anon* %s) {
214 entry:
215   br i1 %flag, label %if.then, label %if.else
217 if.then:
218   %dummy = add i32 %x, 5
219   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
220   store volatile i32 %x, i32* %gepa
221   br label %if.end
223 if.else:
224   %dummy1 = add i32 %x, 6
225   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
226   store volatile i32 %x, i32* %gepb
227   br label %if.end
229 if.end:
230   ret i32 1
233 ; CHECK-LABEL: test10
234 ; CHECK: getelementptr
235 ; CHECK: store volatile
236 ; CHECK: getelementptr
237 ; CHECK: store volatile
239 ; The shufflevector's mask operand cannot be merged in a PHI.
240 define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) {
241 entry:
242   br i1 %flag, label %if.then, label %if.else
244 if.then:
245   %dummy = add i32 %w, 5
246   %sv1 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 0, i32 1>
247   br label %if.end
249 if.else:
250   %dummy1 = add i32 %w, 6
251   %sv2 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 1, i32 0>
252   br label %if.end
254 if.end:
255   %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ]
256   ret i32 1
259 ; CHECK-LABEL: test11
260 ; CHECK: shufflevector
261 ; CHECK: shufflevector
263 ; We can't common an intrinsic!
264 define i32 @test12(i1 zeroext %flag, i32 %w, i32 %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 = call i32 @llvm.ctlz.i32(i32 %x)
271   br label %if.end
273 if.else:
274   %dummy1 = add i32 %w, 6
275   %sv2 = call i32 @llvm.cttz.i32(i32 %x)
276   br label %if.end
278 if.end:
279   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
280   ret i32 1
283 declare i32 @llvm.ctlz.i32(i32 %x) readnone
284 declare i32 @llvm.cttz.i32(i32 %x) readnone
286 ; CHECK-LABEL: test12
287 ; CHECK: call i32 @llvm.ctlz
288 ; CHECK: call i32 @llvm.cttz
290 ; The TBAA metadata should be properly combined.
291 define i32 @test13(i1 zeroext %flag, i32 %x, i32* %y) {
292 entry:
293   br i1 %flag, label %if.then, label %if.else
295 if.then:
296   %z = load volatile i32, i32* %y
297   %a = add i32 %z, 5
298   store volatile i32 %a, i32* %y, !tbaa !3
299   br label %if.end
301 if.else:
302   %w = load volatile i32, i32* %y
303   %b = add i32 %w, 7
304   store volatile i32 %b, i32* %y, !tbaa !4
305   br label %if.end
307 if.end:
308   ret i32 1
311 !0 = !{ !"an example type tree" }
312 !1 = !{ !"int", !0 }
313 !2 = !{ !"float", !0 }
314 !3 = !{ !"const float", !2, i64 0 }
315 !4 = !{ !"special float", !2, i64 1 }
317 ; CHECK-LABEL: test13
318 ; CHECK-DAG: select
319 ; CHECK-DAG: load volatile
320 ; CHECK: store volatile {{.*}}, !tbaa !0
321 ; CHECK-NOT: load
322 ; CHECK-NOT: store
324 ; The call should be commoned.
325 define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
326 entry:
327   br i1 %flag, label %if.then, label %if.else
329 if.then:
330   %sv1 = call i32 @bar(i32 %x)
331   br label %if.end
333 if.else:
334   %sv2 = call i32 @bar(i32 %y)
335   br label %if.end
337 if.end:
338   %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
339   ret i32 1
341 declare i32 @bar(i32)
343 ; CHECK-LABEL: test13a
344 ; CHECK: %[[x:.*]] = select i1 %flag
345 ; CHECK: call i32 @bar(i32 %[[x]])
347 ; The load should be commoned.
348 define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
349 entry:
350   br i1 %flag, label %if.then, label %if.else
352 if.then:
353   %dummy = add i32 %x, 1
354   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
355   %sv1 = load i32, i32* %gepa
356   %cmp1 = icmp eq i32 %sv1, 56
357   br label %if.end
359 if.else:
360   %dummy2 = add i32 %x, 4
361   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
362   %sv2 = load i32, i32* %gepb
363   %cmp2 = icmp eq i32 %sv2, 57
364   br label %if.end
366 if.end:
367   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
368   ret i32 1
371 ; CHECK-LABEL: test14
372 ; CHECK: getelementptr
373 ; CHECK: load
374 ; CHECK-NOT: load
376 ; The load should be commoned.
377 define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, %struct.anon* %s) {
378 entry:
379   br i1 %flag, label %if.then, label %if.else
381 if.then:
382   %dummy = add i32 %x, 1
383   %gepa = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 0
384   %sv1 = load i32, i32* %gepa
385   %ext1 = zext i32 %sv1 to i64
386   %cmp1 = icmp eq i64 %ext1, 56
387   br label %if.end
389 if.else:
390   %dummy2 = add i32 %x, 4
391   %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1
392   %sv2 = load i32, i32* %gepb
393   %ext2 = zext i32 %sv2 to i64
394   %cmp2 = icmp eq i64 %ext2, 56
395   br label %if.end
397 if.end:
398   %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]
399   ret i32 1
402 ; CHECK-LABEL: test15
403 ; CHECK: getelementptr
404 ; CHECK: load
405 ; CHECK-NOT: load
407 define zeroext i1 @test_crash(i1 zeroext %flag, i32* %i4, i32* %m, i32* %n) {
408 entry:
409   br i1 %flag, label %if.then, label %if.else
411 if.then:
412   %tmp1 = load i32, i32* %i4
413   %tmp2 = add i32 %tmp1, -1
414   store i32 %tmp2, i32* %i4
415   br label %if.end
417 if.else:
418   %tmp3 = load i32, i32* %m
419   %tmp4 = load i32, i32* %n
420   %tmp5 = add i32 %tmp3, %tmp4
421   store i32 %tmp5, i32* %i4
422   br label %if.end
424 if.end:
425   ret i1 true
428 ; CHECK-LABEL: test_crash
429 ; No checks for test_crash - just ensure it doesn't crash!
431 define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
433 entry:
434   br i1 %flag, label %if.then, label %if.else
436 if.then:
437   %cmp = icmp uge i32 %blksA, %nblks
438   %frombool1 = zext i1 %cmp to i8
439   br label %if.end
441 if.else:
442   br i1 %flag2, label %if.then2, label %if.end
444 if.then2:
445   %add = add i32 %nblks, %blksB
446   %cmp2 = icmp ule i32 %add, %blksA
447   %frombool3 = zext i1 %cmp2 to i8
448   br label %if.end
450 if.end:
451   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %if.else ]
452   %tobool4 = icmp ne i8 %obeys.0, 0
453   ret i1 %tobool4
456 ; CHECK-LABEL: test16
457 ; CHECK: zext
458 ; CHECK: zext
460 define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, i8* %p) {
462 entry:
463   br i1 %flag, label %if.then, label %if.else
465 if.then:
466   %cmp = icmp uge i32 %blksA, %nblks
467   %frombool1 = zext i1 %cmp to i8
468   %b1 = sext i8 %frombool1 to i32
469   %b2 = trunc i32 %b1 to i8
470   store i8 %b2, i8* %p
471   br label %if.end
473 if.else:
474   br i1 %flag2, label %if.then2, label %if.end
476 if.then2:
477   %add = add i32 %nblks, %blksB
478   %cmp2 = icmp ule i32 %add, %blksA
479   %frombool3 = zext i1 %cmp2 to i8
480   %a1 = sext i8 %frombool3 to i32
481   %a2 = trunc i32 %a1 to i8
482   store i8 %a2, i8* %p
483   br label %if.end
485 if.end:
486   ret i1 true
489 ; CHECK-LABEL: test16a
490 ; CHECK: zext
491 ; CHECK-NOT: zext
493 define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
494 entry:
495   switch i32 %flag, label %if.end [
496     i32 0, label %if.then
497     i32 1, label %if.then2
498   ]
500 if.then:
501   %cmp = icmp uge i32 %blksA, %nblks
502   %frombool1 = call i8 @i1toi8(i1 %cmp)
503   %a1 = sext i8 %frombool1 to i32
504   %a2 = trunc i32 %a1 to i8
505   br label %if.end
507 if.then2:
508   %add = add i32 %nblks, %blksB
509   %cmp2 = icmp ule i32 %add, %blksA
510   %frombool3 = call i8 @i1toi8(i1 %cmp2)
511   %b1 = sext i8 %frombool3 to i32
512   %b2 = trunc i32 %b1 to i8
513   br label %if.end
515 if.end:
516   %obeys.0 = phi i8 [ %a2, %if.then ], [ %b2, %if.then2 ], [ 0, %entry ]
517   %tobool4 = icmp ne i8 %obeys.0, 0
518   ret i1 %tobool4
520 declare i8 @i1toi8(i1)
522 ; FIXME: DISABLED - we don't consider this profitable. We should
523 ;  - Consider argument setup/return mov'ing for calls, like InlineCost does.
524 ;  - Consider the removal of the %obeys.0 PHI (zero PHI movement overall)
526 ; DISABLED-CHECK-LABEL: test17
527 ; DISABLED-CHECK: if.then:
528 ; DISABLED-CHECK-NEXT: icmp uge
529 ; DISABLED-CHECK-NEXT: br label %[[x:.*]]
531 ; DISABLED-CHECK: if.then2:
532 ; DISABLED-CHECK-NEXT: add
533 ; DISABLED-CHECK-NEXT: icmp ule
534 ; DISABLED-CHECK-NEXT: br label %[[x]]
536 ; DISABLED-CHECK: [[x]]:
537 ; DISABLED-CHECK-NEXT: %[[y:.*]] = phi i1 [ %cmp
538 ; DISABLED-CHECK-NEXT: %[[z:.*]] = call i8 @i1toi8(i1 %[[y]])
539 ; DISABLED-CHECK-NEXT: br label %if.end
541 ; DISABLED-CHECK: if.end:
542 ; DISABLED-CHECK-NEXT: phi i8
543 ; DISABLED-CHECK-DAG: [ %[[z]], %[[x]] ]
544 ; DISABLED-CHECK-DAG: [ 0, %entry ]
546 define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
547 entry:
548   switch i32 %flag, label %if.then3 [
549     i32 0, label %if.then
550     i32 1, label %if.then2
551   ]
553 if.then:
554   %cmp = icmp uge i32 %blksA, %nblks
555   %frombool1 = zext i1 %cmp to i8
556   br label %if.end
558 if.then2:
559   %add = add i32 %nblks, %blksB
560   %cmp2 = icmp ule i32 %add, %blksA
561   %frombool3 = zext i1 %cmp2 to i8
562   br label %if.end
564 if.then3:
565   %add2 = add i32 %nblks, %blksA
566   %cmp3 = icmp ule i32 %add2, %blksA
567   %frombool4 = zext i1 %cmp3 to i8
568   br label %if.end
570 if.end:
571   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ %frombool4, %if.then3 ]
572   %tobool4 = icmp ne i8 %obeys.0, 0
573   ret i1 %tobool4
576 ; CHECK-LABEL: test18
577 ; CHECK: if.end:
578 ; CHECK-NEXT: %[[x:.*]] = phi i1
579 ; CHECK-DAG: [ %cmp, %if.then ]
580 ; CHECK-DAG: [ %cmp2, %if.then2 ]
581 ; CHECK-DAG: [ %cmp3, %if.then3 ]
582 ; CHECK-NEXT: zext i1 %[[x]] to i8
584 ; The phi is confusing - both add instructions are used by it, but
585 ; not on their respective unconditional arcs. It should not be
586 ; optimized.
587 define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) {
588 entry:
589   %add1 = add i32 %a, 1
590   br label %succ
592 one:
593   br i1 %cond, label %two, label %succ
595 two:
596   call void @g()
597   %add2 = add i32 %a, 1
598   br label %succ
600 succ:
601   %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ]
602   br label %one
604 declare void @g()
606 ; CHECK-LABEL: test_pr30292
607 ; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ]
609 define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {
611 entry:
612   %p = alloca i8
613   br i1 %flag, label %if.then, label %if.else
615 if.then:
616   %cmp = icmp uge i32 %blksA, %nblks
617   %frombool1 = zext i1 %cmp to i8
618   store i8 %frombool1, i8* %p
619   br label %if.end
621 if.else:
622   br i1 %flag2, label %if.then2, label %if.end
624 if.then2:
625   %add = add i32 %nblks, %blksB
626   %cmp2 = icmp ule i32 %add, %blksA
627   %frombool3 = zext i1 %cmp2 to i8
628   store i8 %frombool3, i8* %p
629   br label %if.end
631 if.end:
632   ret i1 true
635 ; CHECK-LABEL: @test_pr30244
636 ; CHECK: store
637 ; CHECK-NOT: store
639 define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) {
640 entry:
641   br i1 %flag, label %if.then, label %if.else
643 if.then:
644   %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
645   %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
646   %z0 = lshr i32 %y0, 8
647   br label %if.end
649 if.else:
650   %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
651   %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
652   %z1 = lshr exact i32 %y1, 8
653   br label %if.end
655 if.end:
656   %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
657   %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
658   %ret = add i32 %xx, %yy
659   ret i32 %ret
662 ; CHECK-LABEL: test_pr30373a
663 ; CHECK: lshr
664 ; CHECK-NOT: exact
665 ; CHECK: }
667 define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) {
668 entry:
669   br i1 %flag, label %if.then, label %if.else
671 if.then:
672   %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone
673   %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone
674   %z0 = lshr exact i32 %y0, 8
675   br label %if.end
677 if.else:
678   %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone
679   %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone
680   %z1 = lshr i32 %y1, 8
681   br label %if.end
683 if.end:
684   %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]
685   %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]
686   %ret = add i32 %xx, %yy
687   ret i32 %ret
690 ; CHECK-LABEL: test_pr30373b
691 ; CHECK: lshr
692 ; CHECK-NOT: exact
693 ; CHECK: }
695 ; CHECK: !0 = !{!1, !1, i64 0}
696 ; CHECK: !1 = !{!"float", !2}
697 ; CHECK: !2 = !{!"an example type tree"}