[SimplifyLibCalls] Remove useless bits of this tests.
[oota-llvm.git] / test / Transforms / InstCombine / icmp-logical.ll
1 ; RUN: opt -instcombine -S -o - %s | FileCheck %s
2
3 define i1 @masked_and_notallzeroes(i32 %A) {
4 ; CHECK-LABEL: @masked_and_notallzeroes
5 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
6 ; CHECK: icmp ne i32 [[MASK]], 0
7 ; CHECK-NOT: and i32 %A, 39
8 ; CHECK: ret i1
9
10   %mask1 = and i32 %A, 7
11   %tst1 = icmp ne i32 %mask1, 0
12
13   %mask2 = and i32 %A, 39
14   %tst2 = icmp ne i32 %mask2, 0
15
16   %res = and i1 %tst1, %tst2
17   ret i1 %res
18 }
19
20 define i1 @masked_or_allzeroes(i32 %A) {
21 ; CHECK-LABEL: @masked_or_allzeroes
22 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
23 ; CHECK: icmp eq i32 [[MASK]], 0
24 ; CHECK-NOT: and i32 %A, 39
25 ; CHECK: ret i1
26
27   %mask1 = and i32 %A, 7
28   %tst1 = icmp eq i32 %mask1, 0
29
30   %mask2 = and i32 %A, 39
31   %tst2 = icmp eq i32 %mask2, 0
32
33   %res = or i1 %tst1, %tst2
34   ret i1 %res
35 }
36
37 define i1 @masked_and_notallones(i32 %A) {
38 ; CHECK-LABEL: @masked_and_notallones
39 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
40 ; CHECK: icmp ne i32 [[MASK]], 7
41 ; CHECK-NOT: and i32 %A, 39
42 ; CHECK: ret i1
43
44   %mask1 = and i32 %A, 7
45   %tst1 = icmp ne i32 %mask1, 7
46
47   %mask2 = and i32 %A, 39
48   %tst2 = icmp ne i32 %mask2, 39
49
50   %res = and i1 %tst1, %tst2
51   ret i1 %res
52 }
53
54 define i1 @masked_or_allones(i32 %A) {
55 ; CHECK-LABEL: @masked_or_allones
56 ; CHECK: [[MASK:%.*]] = and i32 %A, 7
57 ; CHECK: icmp eq i32 [[MASK]], 7
58 ; CHECK-NOT: and i32 %A, 39
59 ; CHECK: ret i1
60
61   %mask1 = and i32 %A, 7
62   %tst1 = icmp eq i32 %mask1, 7
63
64   %mask2 = and i32 %A, 39
65   %tst2 = icmp eq i32 %mask2, 39
66
67   %res = or i1 %tst1, %tst2
68   ret i1 %res
69 }
70
71 define i1 @masked_and_notA(i32 %A) {
72 ; CHECK-LABEL: @masked_and_notA
73 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
74 ; CHECK: icmp ne i32 [[MASK]], %A
75 ; CHECK-NOT: and i32 %A, 7
76 ; CHECK: ret i1
77
78   %mask1 = and i32 %A, 7
79   %tst1 = icmp ne i32 %mask1, %A
80
81   %mask2 = and i32 %A, 39
82   %tst2 = icmp ne i32 %mask2, %A
83
84   %res = and i1 %tst1, %tst2
85   ret i1 %res
86 }
87
88 define i1 @masked_or_A(i32 %A) {
89 ; CHECK-LABEL: @masked_or_A
90 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
91 ; CHECK: icmp eq i32 [[MASK]], %A
92 ; CHECK-NOT: and i32 %A, 7
93 ; CHECK: ret i1
94
95   %mask1 = and i32 %A, 7
96   %tst1 = icmp eq i32 %mask1, %A
97
98   %mask2 = and i32 %A, 39
99   %tst2 = icmp eq i32 %mask2, %A
100
101   %res = or i1 %tst1, %tst2
102   ret i1 %res
103 }
104
105 define i1 @masked_or_allzeroes_notoptimised(i32 %A) {
106 ; CHECK-LABEL: @masked_or_allzeroes_notoptimised
107 ; CHECK: [[MASK:%.*]] = and i32 %A, 15
108 ; CHECK: icmp eq i32 [[MASK]], 0
109 ; CHECK: [[MASK:%.*]] = and i32 %A, 39
110 ; CHECK: icmp eq i32 [[MASK]], 0
111 ; CHECK: ret i1
112
113   %mask1 = and i32 %A, 15
114   %tst1 = icmp eq i32 %mask1, 0
115
116   %mask2 = and i32 %A, 39
117   %tst2 = icmp eq i32 %mask2, 0
118
119   %res = or i1 %tst1, %tst2
120   ret i1 %res
121 }
122
123 define i1 @nomask_lhs(i32 %in) {
124 ; CHECK-LABEL: @nomask_lhs
125 ; CHECK: [[MASK:%.*]] = and i32 %in, 1
126 ; CHECK: icmp eq i32 [[MASK]], 0
127 ; CHECK-NOT: icmp
128 ; CHECK: ret i1
129   %tst1 = icmp eq i32 %in, 0
130
131   %masked = and i32 %in, 1
132   %tst2 = icmp eq i32 %masked, 0
133
134   %val = or i1 %tst1, %tst2
135   ret i1 %val
136 }
137
138
139 define i1 @nomask_rhs(i32 %in) {
140 ; CHECK-LABEL: @nomask_rhs
141 ; CHECK: [[MASK:%.*]] = and i32 %in, 1
142 ; CHECK: icmp eq i32 [[MASK]], 0
143 ; CHECK-NOT: icmp
144 ; CHECK: ret i1
145   %masked = and i32 %in, 1
146   %tst1 = icmp eq i32 %masked, 0
147
148   %tst2 = icmp eq i32 %in, 0
149
150   %val = or i1 %tst1, %tst2
151   ret i1 %val
152 }
153
154 define i1 @fold_mask_cmps_to_false(i32 %x) {
155 ; CHECK-LABEL: @fold_mask_cmps_to_false
156 ; CHECK: ret i1 false
157   %1 = and i32 %x, 2147483647
158   %2 = icmp eq i32 %1, 0
159   %3 = icmp eq i32 %x, 2147483647
160   %4 = and i1 %3, %2
161   ret i1 %4
162 }
163
164 define i1 @fold_mask_cmps_to_true(i32 %x) {
165 ; CHECK-LABEL: @fold_mask_cmps_to_true
166 ; CHECK: ret i1 true
167   %1 = and i32 %x, 2147483647
168   %2 = icmp ne i32 %1, 0
169   %3 = icmp ne i32 %x, 2147483647
170   %4 = or i1 %3, %2
171   ret i1 %4
172 }