blob: 11f2524109cbe1653cd96d4d7064a5651337ee59 [file] [log] [blame]
Sanjay Patel69632442016-03-25 20:12:25 +00001; NOTE: Assertions have been autogenerated by update_test_checks.py
Duncan Sandsba286d72011-10-26 20:55:21 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4define i64 @pow2(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +00005; CHECK-LABEL: @pow2(
Sanjay Patel69632442016-03-25 20:12:25 +00006; CHECK: [[NEGX:%.*]] = sub i32 0, %x
7; CHECK-NEXT: [[X2:%.*]] = and i32 %x, [[NEGX]]
8; CHECK-NEXT: [[E:%.*]] = zext i32 [[X2]] to i64
9; CHECK-NEXT: ret i64 [[E]]
10;
Duncan Sandsba286d72011-10-26 20:55:21 +000011 %negx = sub i32 0, %x
12 %x2 = and i32 %x, %negx
13 %e = zext i32 %x2 to i64
14 %nege = sub i64 0, %e
15 %e2 = and i64 %e, %nege
16 ret i64 %e2
Duncan Sandsba286d72011-10-26 20:55:21 +000017}
Duncan Sands985ba632011-10-28 18:30:05 +000018
19define i64 @pow2b(i32 %x) {
Stephen Linc1c7a132013-07-14 01:42:54 +000020; CHECK-LABEL: @pow2b(
Sanjay Patel69632442016-03-25 20:12:25 +000021; CHECK: [[SH:%.*]] = shl i32 2, %x
22; CHECK-NEXT: [[E:%.*]] = zext i32 [[SH]] to i64
23; CHECK-NEXT: ret i64 [[E]]
24;
Duncan Sands985ba632011-10-28 18:30:05 +000025 %sh = shl i32 2, %x
26 %e = zext i32 %sh to i64
27 %nege = sub i64 0, %e
28 %e2 = and i64 %e, %nege
29 ret i64 %e2
Duncan Sands985ba632011-10-28 18:30:05 +000030}
David Majnemercd4fbcd2014-07-31 04:49:18 +000031
32define i32 @sub_neg_nuw(i32 %x, i32 %y) {
33; CHECK-LABEL: @sub_neg_nuw(
Sanjay Patel69632442016-03-25 20:12:25 +000034; CHECK: ret i32 %x
35;
David Majnemercd4fbcd2014-07-31 04:49:18 +000036 %neg = sub nuw i32 0, %y
37 %sub = sub i32 %x, %neg
38 ret i32 %sub
David Majnemercd4fbcd2014-07-31 04:49:18 +000039}
David Majnemera315bd82014-09-15 08:15:28 +000040
41define i1 @and_of_icmps0(i32 %b) {
42; CHECK-LABEL: @and_of_icmps0(
Sanjay Patel69632442016-03-25 20:12:25 +000043; CHECK: ret i1 false
44;
David Majnemera315bd82014-09-15 08:15:28 +000045 %1 = add i32 %b, 2
46 %2 = icmp ult i32 %1, 4
47 %cmp3 = icmp sgt i32 %b, 2
48 %cmp = and i1 %2, %cmp3
49 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000050}
51
52define i1 @and_of_icmps1(i32 %b) {
53; CHECK-LABEL: @and_of_icmps1(
Sanjay Patel69632442016-03-25 20:12:25 +000054; CHECK: ret i1 false
55;
David Majnemera315bd82014-09-15 08:15:28 +000056 %1 = add nsw i32 %b, 2
57 %2 = icmp slt i32 %1, 4
58 %cmp3 = icmp sgt i32 %b, 2
59 %cmp = and i1 %2, %cmp3
60 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000061}
62
63define i1 @and_of_icmps2(i32 %b) {
64; CHECK-LABEL: @and_of_icmps2(
Sanjay Patel69632442016-03-25 20:12:25 +000065; CHECK: ret i1 false
66;
David Majnemera315bd82014-09-15 08:15:28 +000067 %1 = add i32 %b, 2
68 %2 = icmp ule i32 %1, 3
69 %cmp3 = icmp sgt i32 %b, 2
70 %cmp = and i1 %2, %cmp3
71 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000072}
73
74define i1 @and_of_icmps3(i32 %b) {
75; CHECK-LABEL: @and_of_icmps3(
Sanjay Patel69632442016-03-25 20:12:25 +000076; CHECK: ret i1 false
77;
David Majnemera315bd82014-09-15 08:15:28 +000078 %1 = add nsw i32 %b, 2
79 %2 = icmp sle i32 %1, 3
80 %cmp3 = icmp sgt i32 %b, 2
81 %cmp = and i1 %2, %cmp3
82 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000083}
84
85define i1 @and_of_icmps4(i32 %b) {
86; CHECK-LABEL: @and_of_icmps4(
Sanjay Patel69632442016-03-25 20:12:25 +000087; CHECK: ret i1 false
88;
David Majnemera315bd82014-09-15 08:15:28 +000089 %1 = add nuw i32 %b, 2
90 %2 = icmp ult i32 %1, 4
91 %cmp3 = icmp ugt i32 %b, 2
92 %cmp = and i1 %2, %cmp3
93 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +000094}
95
96define i1 @and_of_icmps5(i32 %b) {
97; CHECK-LABEL: @and_of_icmps5(
Sanjay Patel69632442016-03-25 20:12:25 +000098; CHECK: ret i1 false
99;
David Majnemera315bd82014-09-15 08:15:28 +0000100 %1 = add nuw i32 %b, 2
101 %2 = icmp ule i32 %1, 3
102 %cmp3 = icmp ugt i32 %b, 2
103 %cmp = and i1 %2, %cmp3
104 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000105}
106
107define i1 @or_of_icmps0(i32 %b) {
108; CHECK-LABEL: @or_of_icmps0(
Sanjay Patel69632442016-03-25 20:12:25 +0000109; CHECK: ret i1 true
110;
David Majnemera315bd82014-09-15 08:15:28 +0000111 %1 = add i32 %b, 2
112 %2 = icmp uge i32 %1, 4
113 %cmp3 = icmp sle i32 %b, 2
114 %cmp = or i1 %2, %cmp3
115 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000116}
117
118define i1 @or_of_icmps1(i32 %b) {
119; CHECK-LABEL: @or_of_icmps1(
Sanjay Patel69632442016-03-25 20:12:25 +0000120; CHECK: ret i1 true
121;
David Majnemera315bd82014-09-15 08:15:28 +0000122 %1 = add nsw i32 %b, 2
123 %2 = icmp sge i32 %1, 4
124 %cmp3 = icmp sle i32 %b, 2
125 %cmp = or i1 %2, %cmp3
126 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000127}
128
129define i1 @or_of_icmps2(i32 %b) {
130; CHECK-LABEL: @or_of_icmps2(
Sanjay Patel69632442016-03-25 20:12:25 +0000131; CHECK: ret i1 true
132;
David Majnemera315bd82014-09-15 08:15:28 +0000133 %1 = add i32 %b, 2
134 %2 = icmp ugt i32 %1, 3
135 %cmp3 = icmp sle i32 %b, 2
136 %cmp = or i1 %2, %cmp3
137 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000138}
139
140define i1 @or_of_icmps3(i32 %b) {
141; CHECK-LABEL: @or_of_icmps3(
Sanjay Patel69632442016-03-25 20:12:25 +0000142; CHECK: ret i1 true
143;
David Majnemera315bd82014-09-15 08:15:28 +0000144 %1 = add nsw i32 %b, 2
145 %2 = icmp sgt i32 %1, 3
146 %cmp3 = icmp sle i32 %b, 2
147 %cmp = or i1 %2, %cmp3
148 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000149}
150
151define i1 @or_of_icmps4(i32 %b) {
152; CHECK-LABEL: @or_of_icmps4(
Sanjay Patel69632442016-03-25 20:12:25 +0000153; CHECK: ret i1 true
154;
David Majnemera315bd82014-09-15 08:15:28 +0000155 %1 = add nuw i32 %b, 2
156 %2 = icmp uge i32 %1, 4
157 %cmp3 = icmp ule i32 %b, 2
158 %cmp = or i1 %2, %cmp3
159 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000160}
161
162define i1 @or_of_icmps5(i32 %b) {
163; CHECK-LABEL: @or_of_icmps5(
Sanjay Patel69632442016-03-25 20:12:25 +0000164; CHECK: ret i1 true
165;
David Majnemera315bd82014-09-15 08:15:28 +0000166 %1 = add nuw i32 %b, 2
167 %2 = icmp ugt i32 %1, 3
168 %cmp3 = icmp ule i32 %b, 2
169 %cmp = or i1 %2, %cmp3
170 ret i1 %cmp
David Majnemera315bd82014-09-15 08:15:28 +0000171}
David Majnemer4efa9ff2014-11-22 07:15:16 +0000172
173define i32 @neg_nuw(i32 %x) {
174; CHECK-LABEL: @neg_nuw(
Sanjay Patel69632442016-03-25 20:12:25 +0000175; CHECK: ret i32 0
176;
David Majnemer4efa9ff2014-11-22 07:15:16 +0000177 %neg = sub nuw i32 0, %x
178 ret i32 %neg
David Majnemer4efa9ff2014-11-22 07:15:16 +0000179}
David Majnemer1af36e52014-12-06 10:51:40 +0000180
181define i1 @and_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000182; CHECK-LABEL: @and_icmp1(
183; CHECK: [[TMP1:%.*]] = icmp ult i32 %x, %y
184; CHECK-NEXT: ret i1 [[TMP1]]
185;
David Majnemer1af36e52014-12-06 10:51:40 +0000186 %1 = icmp ult i32 %x, %y
187 %2 = icmp ne i32 %y, 0
188 %3 = and i1 %1, %2
189 ret i1 %3
190}
David Majnemer1af36e52014-12-06 10:51:40 +0000191
David Majnemerd5b3aa42014-12-08 18:30:43 +0000192define i1 @and_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000193; CHECK-LABEL: @and_icmp2(
194; CHECK: ret i1 false
195;
David Majnemerd5b3aa42014-12-08 18:30:43 +0000196 %1 = icmp ult i32 %x, %y
197 %2 = icmp eq i32 %y, 0
198 %3 = and i1 %1, %2
199 ret i1 %3
200}
David Majnemerd5b3aa42014-12-08 18:30:43 +0000201
David Majnemer1af36e52014-12-06 10:51:40 +0000202define i1 @or_icmp1(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000203; CHECK-LABEL: @or_icmp1(
204; CHECK: [[TMP1:%.*]] = icmp ne i32 %y, 0
205; CHECK-NEXT: ret i1 [[TMP1]]
206;
David Majnemer1af36e52014-12-06 10:51:40 +0000207 %1 = icmp ult i32 %x, %y
208 %2 = icmp ne i32 %y, 0
209 %3 = or i1 %1, %2
210 ret i1 %3
211}
David Majnemer1af36e52014-12-06 10:51:40 +0000212
213define i1 @or_icmp2(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000214; CHECK-LABEL: @or_icmp2(
215; CHECK: ret i1 true
216;
David Majnemer1af36e52014-12-06 10:51:40 +0000217 %1 = icmp uge i32 %x, %y
218 %2 = icmp ne i32 %y, 0
219 %3 = or i1 %1, %2
220 ret i1 %3
221}
David Majnemer1af36e52014-12-06 10:51:40 +0000222
223define i1 @or_icmp3(i32 %x, i32 %y) {
Sanjay Patel69632442016-03-25 20:12:25 +0000224; CHECK-LABEL: @or_icmp3(
225; CHECK: [[TMP1:%.*]] = icmp uge i32 %x, %y
226; CHECK-NEXT: ret i1 [[TMP1]]
227;
David Majnemer1af36e52014-12-06 10:51:40 +0000228 %1 = icmp uge i32 %x, %y
229 %2 = icmp eq i32 %y, 0
230 %3 = or i1 %1, %2
231 ret i1 %3
232}
Sanjay Patel69632442016-03-25 20:12:25 +0000233