Remove a stale comment
[oota-llvm.git] / test / Transforms / InstCombine / minmax-fold.ll
1 ; RUN: opt -S -instcombine < %s | FileCheck %s
2
3 ; CHECK-LABEL: @t1
4 ; CHECK-NEXT: icmp
5 ; CHECK-NEXT: select
6 ; CHECK-NEXT: sext
7 define i64 @t1(i32 %a) {
8   ; This is the canonical form for a type-changing min/max.
9   %1 = icmp slt i32 %a, 5
10   %2 = select i1 %1, i32 %a, i32 5
11   %3 = sext i32 %2 to i64
12   ret i64 %3
13 }
14
15 ; CHECK-LABEL: @t2
16 ; CHECK-NEXT: icmp
17 ; CHECK-NEXT: select
18 ; CHECK-NEXT: sext
19 define i64 @t2(i32 %a) {
20   ; Check this is converted into canonical form, as above.
21   %1 = icmp slt i32 %a, 5
22   %2 = sext i32 %a to i64
23   %3 = select i1 %1, i64 %2, i64 5
24   ret i64 %3
25 }
26
27 ; CHECK-LABEL: @t3
28 ; CHECK-NEXT: icmp
29 ; CHECK-NEXT: select
30 ; CHECK-NEXT: zext
31 define i64 @t3(i32 %a) {
32   ; Same as @t2, with flipped operands and zext instead of sext.
33   %1 = icmp ult i32 %a, 5
34   %2 = zext i32 %a to i64
35   %3 = select i1 %1, i64 5, i64 %2
36   ret i64 %3
37 }
38
39 ; CHECK-LABEL: @t4
40 ; CHECK-NEXT: icmp
41 ; CHECK-NEXT: select
42 ; CHECK-NEXT: trunc
43 define i32 @t4(i64 %a) {
44   ; Same again, with trunc.
45   %1 = icmp slt i64 %a, 5
46   %2 = trunc i64 %a to i32
47   %3 = select i1 %1, i32 %2, i32 5
48   ret i32 %3
49 }
50
51 ; CHECK-LABEL: @t5
52 ; CHECK-NEXT: icmp
53 ; CHECK-NEXT: zext
54 ; CHECK-NEXT: select
55 define i64 @t5(i32 %a) {
56   ; Same as @t3, but with mismatched signedness between icmp and zext.
57   ; InstCombine should leave this alone.
58   %1 = icmp slt i32 %a, 5
59   %2 = zext i32 %a to i64
60   %3 = select i1 %1, i64 5, i64 %2
61   ret i64 %3
62 }
63
64 ; CHECK-LABEL: @t6
65 ; CHECK-NEXT: icmp
66 ; CHECK-NEXT: select
67 ; CHECK-NEXT: sitofp
68 define float @t6(i32 %a) {
69   %1 = icmp slt i32 %a, 0
70   %2 = select i1 %1, i32 %a, i32 0
71   %3 = sitofp i32 %2 to float
72   ret float %3
73 }
74
75 ; CHECK-LABEL: @t7
76 ; CHECK-NEXT: icmp
77 ; CHECK-NEXT: select
78 ; CHECK-NEXT: trunc
79 define i16 @t7(i32 %a) {
80   %1 = icmp slt i32 %a, -32768
81   %2 = trunc i32 %a to i16
82   %3 = select i1 %1, i16 %2, i16 -32768
83   ret i16 %3
84 }
85
86 ; Just check for no infinite loop. InstSimplify liked to
87 ; "simplify" -32767 by removing all the sign bits,
88 ; which led to a canonicalization fight between different
89 ; parts of instcombine.
90 define i32 @t8(i64 %a, i32 %b) {
91   %1 = icmp slt i64 %a, -32767
92   %2 = select i1 %1, i64 %a, i64 -32767
93   %3 = trunc i64 %2 to i32
94   %4 = icmp slt i32 %b, 42
95   %5 = select i1 %4, i32 42, i32 %3
96   %6 = icmp ne i32 %5, %b
97   %7 = zext i1 %6 to i32
98   ret i32 %7
99 }