Revert a part of r223583, for now. It seems causing different emission between stage2...
[oota-llvm.git] / test / Transforms / InstSimplify / AndOrXor.ll
1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3 define i64 @pow2(i32 %x) {
4 ; CHECK-LABEL: @pow2(
5   %negx = sub i32 0, %x
6   %x2 = and i32 %x, %negx
7   %e = zext i32 %x2 to i64
8   %nege = sub i64 0, %e
9   %e2 = and i64 %e, %nege
10   ret i64 %e2
11 ; CHECK: ret i64 %e
12 }
13
14 define i64 @pow2b(i32 %x) {
15 ; CHECK-LABEL: @pow2b(
16   %sh = shl i32 2, %x
17   %e = zext i32 %sh to i64
18   %nege = sub i64 0, %e
19   %e2 = and i64 %e, %nege
20   ret i64 %e2
21 ; CHECK: ret i64 %e
22 }
23
24 define i32 @sub_neg_nuw(i32 %x, i32 %y) {
25 ; CHECK-LABEL: @sub_neg_nuw(
26   %neg = sub nuw i32 0, %y
27   %sub = sub i32 %x, %neg
28   ret i32 %sub
29 ; CHECK: ret i32 %x
30 }
31
32 define i1 @and_of_icmps0(i32 %b) {
33 ; CHECK-LABEL: @and_of_icmps0(
34   %1 = add i32 %b, 2
35   %2 = icmp ult i32 %1, 4
36   %cmp3 = icmp sgt i32 %b, 2
37   %cmp = and i1 %2, %cmp3
38   ret i1 %cmp
39 ; CHECK: ret i1 false
40 }
41
42 define i1 @and_of_icmps1(i32 %b) {
43 ; CHECK-LABEL: @and_of_icmps1(
44   %1 = add nsw i32 %b, 2
45   %2 = icmp slt i32 %1, 4
46   %cmp3 = icmp sgt i32 %b, 2
47   %cmp = and i1 %2, %cmp3
48   ret i1 %cmp
49 ; CHECK: ret i1 false
50 }
51
52 define i1 @and_of_icmps2(i32 %b) {
53 ; CHECK-LABEL: @and_of_icmps2(
54   %1 = add i32 %b, 2
55   %2 = icmp ule i32 %1, 3
56   %cmp3 = icmp sgt i32 %b, 2
57   %cmp = and i1 %2, %cmp3
58   ret i1 %cmp
59 ; CHECK: ret i1 false
60 }
61
62 define i1 @and_of_icmps3(i32 %b) {
63 ; CHECK-LABEL: @and_of_icmps3(
64   %1 = add nsw i32 %b, 2
65   %2 = icmp sle i32 %1, 3
66   %cmp3 = icmp sgt i32 %b, 2
67   %cmp = and i1 %2, %cmp3
68   ret i1 %cmp
69 ; CHECK: ret i1 false
70 }
71
72 define i1 @and_of_icmps4(i32 %b) {
73 ; CHECK-LABEL: @and_of_icmps4(
74   %1 = add nuw i32 %b, 2
75   %2 = icmp ult i32 %1, 4
76   %cmp3 = icmp ugt i32 %b, 2
77   %cmp = and i1 %2, %cmp3
78   ret i1 %cmp
79 ; CHECK: ret i1 false
80 }
81
82 define i1 @and_of_icmps5(i32 %b) {
83 ; CHECK-LABEL: @and_of_icmps5(
84   %1 = add nuw i32 %b, 2
85   %2 = icmp ule i32 %1, 3
86   %cmp3 = icmp ugt i32 %b, 2
87   %cmp = and i1 %2, %cmp3
88   ret i1 %cmp
89 ; CHECK: ret i1 false
90 }
91
92 define i1 @or_of_icmps0(i32 %b) {
93 ; CHECK-LABEL: @or_of_icmps0(
94   %1 = add i32 %b, 2
95   %2 = icmp uge i32 %1, 4
96   %cmp3 = icmp sle i32 %b, 2
97   %cmp = or i1 %2, %cmp3
98   ret i1 %cmp
99 ; CHECK: ret i1 true
100 }
101
102 define i1 @or_of_icmps1(i32 %b) {
103 ; CHECK-LABEL: @or_of_icmps1(
104   %1 = add nsw i32 %b, 2
105   %2 = icmp sge i32 %1, 4
106   %cmp3 = icmp sle i32 %b, 2
107   %cmp = or i1 %2, %cmp3
108   ret i1 %cmp
109 ; CHECK: ret i1 true
110 }
111
112 define i1 @or_of_icmps2(i32 %b) {
113 ; CHECK-LABEL: @or_of_icmps2(
114   %1 = add i32 %b, 2
115   %2 = icmp ugt i32 %1, 3
116   %cmp3 = icmp sle i32 %b, 2
117   %cmp = or i1 %2, %cmp3
118   ret i1 %cmp
119 ; CHECK: ret i1 true
120 }
121
122 define i1 @or_of_icmps3(i32 %b) {
123 ; CHECK-LABEL: @or_of_icmps3(
124   %1 = add nsw i32 %b, 2
125   %2 = icmp sgt i32 %1, 3
126   %cmp3 = icmp sle i32 %b, 2
127   %cmp = or i1 %2, %cmp3
128   ret i1 %cmp
129 ; CHECK: ret i1 true
130 }
131
132 define i1 @or_of_icmps4(i32 %b) {
133 ; CHECK-LABEL: @or_of_icmps4(
134   %1 = add nuw i32 %b, 2
135   %2 = icmp uge i32 %1, 4
136   %cmp3 = icmp ule i32 %b, 2
137   %cmp = or i1 %2, %cmp3
138   ret i1 %cmp
139 ; CHECK: ret i1 true
140 }
141
142 define i1 @or_of_icmps5(i32 %b) {
143 ; CHECK-LABEL: @or_of_icmps5(
144   %1 = add nuw i32 %b, 2
145   %2 = icmp ugt i32 %1, 3
146   %cmp3 = icmp ule i32 %b, 2
147   %cmp = or i1 %2, %cmp3
148   ret i1 %cmp
149 ; CHECK: ret i1 true
150 }
151
152 define i32 @neg_nuw(i32 %x) {
153 ; CHECK-LABEL: @neg_nuw(
154   %neg = sub nuw i32 0, %x
155   ret i32 %neg
156 ; CHECK: ret i32 0
157 }
158
159 define i1 @and_icmp1(i32 %x, i32 %y) {
160   %1 = icmp ult i32 %x, %y
161   %2 = icmp ne i32 %y, 0
162   %3 = and i1 %1, %2
163   ret i1 %3
164 }
165 ; CHECK-LABEL: @and_icmp1(
166 ; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y
167 ; CHECK: ret i1 %[[cmp]]
168
169 define i1 @or_icmp1(i32 %x, i32 %y) {
170   %1 = icmp ult i32 %x, %y
171   %2 = icmp ne i32 %y, 0
172   %3 = or i1 %1, %2
173   ret i1 %3
174 }
175 ; CHECK-LABEL: @or_icmp1(
176 ; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0
177 ; CHECK: ret i1 %[[cmp]]
178
179 define i1 @or_icmp2(i32 %x, i32 %y) {
180   %1 = icmp uge i32 %x, %y
181   %2 = icmp ne i32 %y, 0
182   %3 = or i1 %1, %2
183   ret i1 %3
184 }
185 ; CHECK-LABEL: @or_icmp2(
186 ; CHECK: ret i1 true
187
188 define i1 @or_icmp3(i32 %x, i32 %y) {
189   %1 = icmp uge i32 %x, %y
190   %2 = icmp eq i32 %y, 0
191   %3 = or i1 %1, %2
192   ret i1 %3
193 }
194 ; CHECK-LABEL: @or_icmp3(
195 ; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y
196 ; CHECK: ret i1 %[[cmp]]