[opaque pointer type] Add textual IR support for explicit type parameter for global...
[oota-llvm.git] / test / Transforms / InstCombine / abs_abs.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 define i32 @abs_abs_x01(i32 %x) {
4   %cmp = icmp sgt i32 %x, -1
5   %sub = sub nsw i32 0, %x
6   %cond = select i1 %cmp, i32 %x, i32 %sub
7   %cmp1 = icmp sgt i32 %cond, -1
8   %sub16 = sub nsw i32 0, %cond
9   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
10   ret i32 %cond18
11 ; CHECK-LABEL: @abs_abs_x01(
12 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
13 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
14 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
15 ; CHECK-NEXT: ret i32 [[SEL]]
16 }
17
18 define i32 @abs_abs_x02(i32 %x) {
19   %cmp = icmp sgt i32 %x, 0
20   %sub = sub nsw i32 0, %x
21   %cond = select i1 %cmp, i32 %x, i32 %sub
22   %cmp1 = icmp sgt i32 %cond, -1
23   %sub16 = sub nsw i32 0, %cond
24   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
25   ret i32 %cond18
26 ; CHECK-LABEL: @abs_abs_x02(
27 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
28 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
29 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
30 ; CHECK-NEXT: ret i32 [[SEL]]
31 }
32
33 define i32 @abs_abs_x03(i32 %x) {
34   %cmp = icmp slt i32 %x, 0
35   %sub = sub nsw i32 0, %x
36   %cond = select i1 %cmp, i32 %sub, i32 %x
37   %cmp1 = icmp sgt i32 %cond, -1
38   %sub16 = sub nsw i32 0, %cond
39   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
40   ret i32 %cond18
41 ; CHECK-LABEL: @abs_abs_x03(
42 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
43 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
44 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
45 ; CHECK-NEXT: ret i32 [[SEL]]
46 }
47
48 define i32 @abs_abs_x04(i32 %x) {
49   %cmp = icmp slt i32 %x, 1
50   %sub = sub nsw i32 0, %x
51   %cond = select i1 %cmp, i32 %sub, i32 %x
52   %cmp1 = icmp sgt i32 %cond, -1
53   %sub16 = sub nsw i32 0, %cond
54   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
55   ret i32 %cond18
56 ; CHECK-LABEL: @abs_abs_x04(
57 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
58 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
59 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
60 ; CHECK-NEXT: ret i32 [[SEL]]
61 }
62
63 define i32 @abs_abs_x05(i32 %x) {
64   %cmp = icmp sgt i32 %x, -1
65   %sub = sub nsw i32 0, %x
66   %cond = select i1 %cmp, i32 %x, i32 %sub
67   %cmp1 = icmp sgt i32 %cond, 0
68   %sub16 = sub nsw i32 0, %cond
69   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
70   ret i32 %cond18
71 ; CHECK-LABEL: @abs_abs_x05(
72 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
73 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
74 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
75 ; CHECK-NEXT: ret i32 [[SEL]]
76 }
77
78 define i32 @abs_abs_x06(i32 %x) {
79   %cmp = icmp sgt i32 %x, 0
80   %sub = sub nsw i32 0, %x
81   %cond = select i1 %cmp, i32 %x, i32 %sub
82   %cmp1 = icmp sgt i32 %cond, 0
83   %sub16 = sub nsw i32 0, %cond
84   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
85   ret i32 %cond18
86 ; CHECK-LABEL: @abs_abs_x06(
87 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
88 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
89 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
90 ; CHECK-NEXT: ret i32 [[SEL]]
91 }
92
93 define i32 @abs_abs_x07(i32 %x) {
94   %cmp = icmp slt i32 %x, 0
95   %sub = sub nsw i32 0, %x
96   %cond = select i1 %cmp, i32 %sub, i32 %x
97   %cmp1 = icmp sgt i32 %cond, 0
98   %sub16 = sub nsw i32 0, %cond
99   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
100   ret i32 %cond18
101 ; CHECK-LABEL: @abs_abs_x07(
102 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
103 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
104 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
105 ; CHECK-NEXT: ret i32 [[SEL]]
106 }
107
108 define i32 @abs_abs_x08(i32 %x) {
109   %cmp = icmp slt i32 %x, 1
110   %sub = sub nsw i32 0, %x
111   %cond = select i1 %cmp, i32 %sub, i32 %x
112   %cmp1 = icmp sgt i32 %cond, 0
113   %sub16 = sub nsw i32 0, %cond
114   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
115   ret i32 %cond18
116 ; CHECK-LABEL: @abs_abs_x08(
117 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
118 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
119 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
120 ; CHECK-NEXT: ret i32 [[SEL]]
121 }
122
123 define i32 @abs_abs_x09(i32 %x) {
124   %cmp = icmp sgt i32 %x, -1
125   %sub = sub nsw i32 0, %x
126   %cond = select i1 %cmp, i32 %x, i32 %sub
127   %cmp1 = icmp slt i32 %cond, 0
128   %sub9 = sub nsw i32 0, %cond
129   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
130   ret i32 %cond18
131 ; CHECK-LABEL: @abs_abs_x09(
132 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
133 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
134 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
135 ; CHECK-NEXT: ret i32 [[SEL]]
136 }
137
138 define i32 @abs_abs_x10(i32 %x) {
139   %cmp = icmp sgt i32 %x, 0
140   %sub = sub nsw i32 0, %x
141   %cond = select i1 %cmp, i32 %x, i32 %sub
142   %cmp1 = icmp slt i32 %cond, 0
143   %sub9 = sub nsw i32 0, %cond
144   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
145   ret i32 %cond18
146 ; CHECK-LABEL: @abs_abs_x10(
147 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
148 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
149 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
150 ; CHECK-NEXT: ret i32 [[SEL]]
151 }
152
153 define i32 @abs_abs_x11(i32 %x) {
154   %cmp = icmp slt i32 %x, 0
155   %sub = sub nsw i32 0, %x
156   %cond = select i1 %cmp, i32 %sub, i32 %x
157   %cmp1 = icmp slt i32 %cond, 0
158   %sub9 = sub nsw i32 0, %cond
159   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
160   ret i32 %cond18
161 ; CHECK-LABEL: @abs_abs_x11(
162 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
163 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
164 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
165 ; CHECK-NEXT: ret i32 [[SEL]]
166 }
167
168 define i32 @abs_abs_x12(i32 %x) {
169   %cmp = icmp slt i32 %x, 1
170   %sub = sub nsw i32 0, %x
171   %cond = select i1 %cmp, i32 %sub, i32 %x
172   %cmp1 = icmp slt i32 %cond, 0
173   %sub9 = sub nsw i32 0, %cond
174   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
175   ret i32 %cond18
176 ; CHECK-LABEL: @abs_abs_x12(
177 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
178 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
179 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
180 ; CHECK-NEXT: ret i32 [[SEL]]
181 }
182
183 define i32 @abs_abs_x13(i32 %x) {
184   %cmp = icmp sgt i32 %x, -1
185   %sub = sub nsw i32 0, %x
186   %cond = select i1 %cmp, i32 %x, i32 %sub
187   %cmp1 = icmp slt i32 %cond, 1
188   %sub9 = sub nsw i32 0, %cond
189   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
190   ret i32 %cond18
191 ; CHECK-LABEL: @abs_abs_x13(
192 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
193 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
194 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
195 ; CHECK-NEXT: ret i32 [[SEL]]
196 }
197
198 define i32 @abs_abs_x14(i32 %x) {
199   %cmp = icmp sgt i32 %x, 0
200   %sub = sub nsw i32 0, %x
201   %cond = select i1 %cmp, i32 %x, i32 %sub
202   %cmp1 = icmp slt i32 %cond, 1
203   %sub9 = sub nsw i32 0, %cond
204   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
205   ret i32 %cond18
206 ; CHECK-LABEL: @abs_abs_x14(
207 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
208 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
209 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
210 ; CHECK-NEXT: ret i32 [[SEL]]
211 }
212
213 define i32 @abs_abs_x15(i32 %x) {
214   %cmp = icmp slt i32 %x, 0
215   %sub = sub nsw i32 0, %x
216   %cond = select i1 %cmp, i32 %sub, i32 %x
217   %cmp1 = icmp slt i32 %cond, 1
218   %sub9 = sub nsw i32 0, %cond
219   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
220   ret i32 %cond18
221 ; CHECK-LABEL: @abs_abs_x15(
222 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
223 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
224 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
225 ; CHECK-NEXT: ret i32 [[SEL]]
226 }
227
228 define i32 @abs_abs_x16(i32 %x) {
229   %cmp = icmp slt i32 %x, 1
230   %sub = sub nsw i32 0, %x
231   %cond = select i1 %cmp, i32 %sub, i32 %x
232   %cmp1 = icmp slt i32 %cond, 1
233   %sub9 = sub nsw i32 0, %cond
234   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
235   ret i32 %cond18
236 ; CHECK-LABEL: @abs_abs_x16(
237 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
238 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
239 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
240 ; CHECK-NEXT: ret i32 [[SEL]]
241 }
242
243 define i32 @nabs_nabs_x01(i32 %x) {
244   %cmp = icmp sgt i32 %x, -1
245   %sub = sub nsw i32 0, %x
246   %cond = select i1 %cmp, i32 %sub, i32 %x
247   %cmp1 = icmp sgt i32 %cond, -1
248   %sub9 = sub nsw i32 0, %cond
249   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
250   ret i32 %cond18
251 ; CHECK-LABEL: @nabs_nabs_x01(
252 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
253 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
254 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
255 ; CHECK-NEXT: ret i32 [[SEL]]
256 }
257
258 define i32 @nabs_nabs_x02(i32 %x) {
259   %cmp = icmp sgt i32 %x, 0
260   %sub = sub nsw i32 0, %x
261   %cond = select i1 %cmp, i32 %sub, i32 %x
262   %cmp1 = icmp sgt i32 %cond, -1
263   %sub9 = sub nsw i32 0, %cond
264   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
265   ret i32 %cond18
266 ; CHECK-LABEL: @nabs_nabs_x02(
267 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
268 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
269 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
270 ; CHECK-NEXT: ret i32 [[SEL]]
271 }
272
273 define i32 @nabs_nabs_x03(i32 %x) {
274   %cmp = icmp slt i32 %x, 0
275   %sub = sub nsw i32 0, %x
276   %cond = select i1 %cmp, i32 %x, i32 %sub
277   %cmp1 = icmp sgt i32 %cond, -1
278   %sub9 = sub nsw i32 0, %cond
279   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
280   ret i32 %cond18
281 ; CHECK-LABEL: @nabs_nabs_x03(
282 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
283 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
284 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
285 ; CHECK-NEXT: ret i32 [[SEL]]
286 }
287
288 define i32 @nabs_nabs_x04(i32 %x) {
289   %cmp = icmp slt i32 %x, 1
290   %sub = sub nsw i32 0, %x
291   %cond = select i1 %cmp, i32 %x, i32 %sub
292   %cmp1 = icmp sgt i32 %cond, -1
293   %sub9 = sub nsw i32 0, %cond
294   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
295   ret i32 %cond18
296 ; CHECK-LABEL: @nabs_nabs_x04(
297 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
298 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
299 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
300 ; CHECK-NEXT: ret i32 [[SEL]]
301 }
302
303 define i32 @nabs_nabs_x05(i32 %x) {
304   %cmp = icmp sgt i32 %x, -1
305   %sub = sub nsw i32 0, %x
306   %cond = select i1 %cmp, i32 %sub, i32 %x
307   %cmp1 = icmp sgt i32 %cond, 0
308   %sub9 = sub nsw i32 0, %cond
309   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
310   ret i32 %cond18
311 ; CHECK-LABEL: @nabs_nabs_x05(
312 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
313 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
314 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
315 ; CHECK-NEXT: ret i32 [[SEL]]
316 }
317
318 define i32 @nabs_nabs_x06(i32 %x) {
319   %cmp = icmp sgt i32 %x, 0
320   %sub = sub nsw i32 0, %x
321   %cond = select i1 %cmp, i32 %sub, i32 %x
322   %cmp1 = icmp sgt i32 %cond, 0
323   %sub9 = sub nsw i32 0, %cond
324   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
325   ret i32 %cond18
326 ; CHECK-LABEL: @nabs_nabs_x06(
327 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
328 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
329 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
330 ; CHECK-NEXT: ret i32 [[SEL]]
331 }
332
333 define i32 @nabs_nabs_x07(i32 %x) {
334   %cmp = icmp slt i32 %x, 0
335   %sub = sub nsw i32 0, %x
336   %cond = select i1 %cmp, i32 %x, i32 %sub
337   %cmp1 = icmp sgt i32 %cond, 0
338   %sub9 = sub nsw i32 0, %cond
339   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
340   ret i32 %cond18
341 ; CHECK-LABEL: @nabs_nabs_x07(
342 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
343 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
344 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
345 ; CHECK-NEXT: ret i32 [[SEL]]
346 }
347
348 define i32 @nabs_nabs_x08(i32 %x) {
349   %cmp = icmp slt i32 %x, 1
350   %sub = sub nsw i32 0, %x
351   %cond = select i1 %cmp, i32 %x, i32 %sub
352   %cmp1 = icmp sgt i32 %cond, 0
353   %sub9 = sub nsw i32 0, %cond
354   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
355   ret i32 %cond18
356 ; CHECK-LABEL: @nabs_nabs_x08(
357 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
358 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
359 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
360 ; CHECK-NEXT: ret i32 [[SEL]]
361 }
362
363 define i32 @nabs_nabs_x09(i32 %x) {
364   %cmp = icmp sgt i32 %x, -1
365   %sub = sub nsw i32 0, %x
366   %cond = select i1 %cmp, i32 %sub, i32 %x
367   %cmp1 = icmp slt i32 %cond, 0
368   %sub16 = sub nsw i32 0, %cond
369   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
370   ret i32 %cond18
371 ; CHECK-LABEL: @nabs_nabs_x09(
372 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
373 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
374 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
375 ; CHECK-NEXT: ret i32 [[SEL]]
376 }
377
378 define i32 @nabs_nabs_x10(i32 %x) {
379   %cmp = icmp sgt i32 %x, 0
380   %sub = sub nsw i32 0, %x
381   %cond = select i1 %cmp, i32 %sub, i32 %x
382   %cmp1 = icmp slt i32 %cond, 0
383   %sub16 = sub nsw i32 0, %cond
384   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
385   ret i32 %cond18
386 ; CHECK-LABEL: @nabs_nabs_x10(
387 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
388 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
389 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
390 ; CHECK-NEXT: ret i32 [[SEL]]
391 }
392
393 define i32 @nabs_nabs_x11(i32 %x) {
394   %cmp = icmp slt i32 %x, 0
395   %sub = sub nsw i32 0, %x
396   %cond = select i1 %cmp, i32 %x, i32 %sub
397   %cmp1 = icmp slt i32 %cond, 0
398   %sub16 = sub nsw i32 0, %cond
399   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
400   ret i32 %cond18
401 ; CHECK-LABEL: @nabs_nabs_x11(
402 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
403 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
404 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
405 ; CHECK-NEXT: ret i32 [[SEL]]
406 }
407
408 define i32 @nabs_nabs_x12(i32 %x) {
409   %cmp = icmp slt i32 %x, 1
410   %sub = sub nsw i32 0, %x
411   %cond = select i1 %cmp, i32 %x, i32 %sub
412   %cmp1 = icmp slt i32 %cond, 0
413   %sub16 = sub nsw i32 0, %cond
414   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
415   ret i32 %cond18
416 ; CHECK-LABEL: @nabs_nabs_x12(
417 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
418 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
419 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
420 ; CHECK-NEXT: ret i32 [[SEL]]
421 }
422
423 define i32 @nabs_nabs_x13(i32 %x) {
424   %cmp = icmp sgt i32 %x, -1
425   %sub = sub nsw i32 0, %x
426   %cond = select i1 %cmp, i32 %sub, i32 %x
427   %cmp1 = icmp slt i32 %cond, 1
428   %sub16 = sub nsw i32 0, %cond
429   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
430   ret i32 %cond18
431 ; CHECK-LABEL: @nabs_nabs_x13(
432 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
433 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
434 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
435 ; CHECK-NEXT: ret i32 [[SEL]]
436 }
437
438 define i32 @nabs_nabs_x14(i32 %x) {
439   %cmp = icmp sgt i32 %x, 0
440   %sub = sub nsw i32 0, %x
441   %cond = select i1 %cmp, i32 %sub, i32 %x
442   %cmp1 = icmp slt i32 %cond, 1
443   %sub16 = sub nsw i32 0, %cond
444   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
445   ret i32 %cond18
446 ; CHECK-LABEL: @nabs_nabs_x14(
447 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
448 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
449 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
450 ; CHECK-NEXT: ret i32 [[SEL]]
451 }
452
453 define i32 @nabs_nabs_x15(i32 %x) {
454   %cmp = icmp slt i32 %x, 0
455   %sub = sub nsw i32 0, %x
456   %cond = select i1 %cmp, i32 %x, i32 %sub
457   %cmp1 = icmp slt i32 %cond, 1
458   %sub16 = sub nsw i32 0, %cond
459   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
460   ret i32 %cond18
461 ; CHECK-LABEL: @nabs_nabs_x15(
462 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
463 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
464 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
465 ; CHECK-NEXT: ret i32 [[SEL]]
466 }
467
468 define i32 @nabs_nabs_x16(i32 %x) {
469   %cmp = icmp slt i32 %x, 1
470   %sub = sub nsw i32 0, %x
471   %cond = select i1 %cmp, i32 %x, i32 %sub
472   %cmp1 = icmp slt i32 %cond, 1
473   %sub16 = sub nsw i32 0, %cond
474   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
475   ret i32 %cond18
476 ; CHECK-LABEL: @nabs_nabs_x16(
477 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
478 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
479 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
480 ; CHECK-NEXT: ret i32 [[SEL]]
481 }
482
483 define i32 @abs_nabs_x01(i32 %x) {
484   %cmp = icmp sgt i32 %x, -1
485   %sub = sub nsw i32 0, %x
486   %cond = select i1 %cmp, i32 %sub, i32 %x
487   %cmp1 = icmp sgt i32 %cond, -1
488   %sub16 = sub nsw i32 0, %cond
489   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
490   ret i32 %cond18
491 ; CHECK-LABEL: @abs_nabs_x01(
492 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
493 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
494 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
495 ; CHECK-NEXT: ret i32 [[SEL]]
496 }
497
498 define i32 @abs_nabs_x02(i32 %x) {
499   %cmp = icmp sgt i32 %x, 0
500   %sub = sub nsw i32 0, %x
501   %cond = select i1 %cmp, i32 %sub, i32 %x
502   %cmp1 = icmp sgt i32 %cond, -1
503   %sub16 = sub nsw i32 0, %cond
504   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
505   ret i32 %cond18
506 ; CHECK-LABEL: @abs_nabs_x02(
507 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
508 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
509 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
510 ; CHECK-NEXT: ret i32 [[SEL]]
511 }
512
513 define i32 @abs_nabs_x03(i32 %x) {
514   %cmp = icmp slt i32 %x, 0
515   %sub = sub nsw i32 0, %x
516   %cond = select i1 %cmp, i32 %x, i32 %sub
517   %cmp1 = icmp sgt i32 %cond, -1
518   %sub16 = sub nsw i32 0, %cond
519   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
520   ret i32 %cond18
521 ; CHECK-LABEL: @abs_nabs_x03(
522 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
523 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
524 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
525 ; CHECK-NEXT: ret i32 [[SEL]]
526 }
527
528 define i32 @abs_nabs_x04(i32 %x) {
529   %cmp = icmp slt i32 %x, 1
530   %sub = sub nsw i32 0, %x
531   %cond = select i1 %cmp, i32 %x, i32 %sub
532   %cmp1 = icmp sgt i32 %cond, -1
533   %sub16 = sub nsw i32 0, %cond
534   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
535   ret i32 %cond18
536 ; CHECK-LABEL: @abs_nabs_x04(
537 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
538 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
539 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
540 ; CHECK-NEXT: ret i32 [[SEL]]
541 }
542
543 define i32 @abs_nabs_x05(i32 %x) {
544   %cmp = icmp sgt i32 %x, -1
545   %sub = sub nsw i32 0, %x
546   %cond = select i1 %cmp, i32 %sub, i32 %x
547   %cmp1 = icmp sgt i32 %cond, 0
548   %sub16 = sub nsw i32 0, %cond
549   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
550   ret i32 %cond18
551 ; CHECK-LABEL: @abs_nabs_x05(
552 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
553 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
554 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
555 ; CHECK-NEXT: ret i32 [[SEL]]
556 }
557
558 define i32 @abs_nabs_x06(i32 %x) {
559   %cmp = icmp sgt i32 %x, 0
560   %sub = sub nsw i32 0, %x
561   %cond = select i1 %cmp, i32 %sub, i32 %x
562   %cmp1 = icmp sgt i32 %cond, 0
563   %sub16 = sub nsw i32 0, %cond
564   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
565   ret i32 %cond18
566 ; CHECK-LABEL: @abs_nabs_x06(
567 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
568 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
569 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
570 ; CHECK-NEXT: ret i32 [[SEL]]
571 }
572
573 define i32 @abs_nabs_x07(i32 %x) {
574   %cmp = icmp slt i32 %x, 0
575   %sub = sub nsw i32 0, %x
576   %cond = select i1 %cmp, i32 %x, i32 %sub
577   %cmp1 = icmp sgt i32 %cond, 0
578   %sub16 = sub nsw i32 0, %cond
579   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
580   ret i32 %cond18
581 ; CHECK-LABEL: @abs_nabs_x07(
582 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
583 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
584 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
585 ; CHECK-NEXT: ret i32 [[SEL]]
586 }
587
588 define i32 @abs_nabs_x08(i32 %x) {
589   %cmp = icmp slt i32 %x, 1
590   %sub = sub nsw i32 0, %x
591   %cond = select i1 %cmp, i32 %x, i32 %sub
592   %cmp1 = icmp sgt i32 %cond, 0
593   %sub16 = sub nsw i32 0, %cond
594   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
595   ret i32 %cond18
596 ; CHECK-LABEL: @abs_nabs_x08(
597 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
598 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
599 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
600 ; CHECK-NEXT: ret i32 [[SEL]]
601 }
602
603 define i32 @abs_nabs_x09(i32 %x) {
604   %cmp = icmp sgt i32 %x, -1
605   %sub = sub nsw i32 0, %x
606   %cond = select i1 %cmp, i32 %sub, i32 %x
607   %cmp1 = icmp slt i32 %cond, 0
608   %sub9 = sub nsw i32 0, %cond
609   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
610   ret i32 %cond18
611 ; CHECK-LABEL: @abs_nabs_x09(
612 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
613 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
614 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
615 ; CHECK-NEXT: ret i32 [[SEL]]
616 }
617
618 define i32 @abs_nabs_x10(i32 %x) {
619   %cmp = icmp sgt i32 %x, 0
620   %sub = sub nsw i32 0, %x
621   %cond = select i1 %cmp, i32 %sub, i32 %x
622   %cmp1 = icmp slt i32 %cond, 0
623   %sub9 = sub nsw i32 0, %cond
624   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
625   ret i32 %cond18
626 ; CHECK-LABEL: @abs_nabs_x10(
627 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
628 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
629 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
630 ; CHECK-NEXT: ret i32 [[SEL]]
631 }
632
633 define i32 @abs_nabs_x11(i32 %x) {
634   %cmp = icmp slt i32 %x, 0
635   %sub = sub nsw i32 0, %x
636   %cond = select i1 %cmp, i32 %x, i32 %sub
637   %cmp1 = icmp slt i32 %cond, 0
638   %sub9 = sub nsw i32 0, %cond
639   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
640   ret i32 %cond18
641 ; CHECK-LABEL: @abs_nabs_x11(
642 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
643 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
644 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
645 ; CHECK-NEXT: ret i32 [[SEL]]
646 }
647
648 define i32 @abs_nabs_x12(i32 %x) {
649   %cmp = icmp slt i32 %x, 1
650   %sub = sub nsw i32 0, %x
651   %cond = select i1 %cmp, i32 %x, i32 %sub
652   %cmp1 = icmp slt i32 %cond, 0
653   %sub9 = sub nsw i32 0, %cond
654   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
655   ret i32 %cond18
656 ; CHECK-LABEL: @abs_nabs_x12(
657 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
658 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
659 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
660 ; CHECK-NEXT: ret i32 [[SEL]]
661 }
662
663 define i32 @abs_nabs_x13(i32 %x) {
664   %cmp = icmp sgt i32 %x, -1
665   %sub = sub nsw i32 0, %x
666   %cond = select i1 %cmp, i32 %sub, i32 %x
667   %cmp1 = icmp slt i32 %cond, 1
668   %sub9 = sub nsw i32 0, %cond
669   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
670   ret i32 %cond18
671 ; CHECK-LABEL: @abs_nabs_x13(
672 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
673 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
674 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
675 ; CHECK-NEXT: ret i32 [[SEL]]
676 }
677
678 define i32 @abs_nabs_x14(i32 %x) {
679   %cmp = icmp sgt i32 %x, 0
680   %sub = sub nsw i32 0, %x
681   %cond = select i1 %cmp, i32 %sub, i32 %x
682   %cmp1 = icmp slt i32 %cond, 1
683   %sub9 = sub nsw i32 0, %cond
684   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
685   ret i32 %cond18
686 ; CHECK-LABEL: @abs_nabs_x14(
687 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
688 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
689 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
690 ; CHECK-NEXT: ret i32 [[SEL]]
691 }
692
693 define i32 @abs_nabs_x15(i32 %x) {
694   %cmp = icmp slt i32 %x, 0
695   %sub = sub nsw i32 0, %x
696   %cond = select i1 %cmp, i32 %x, i32 %sub
697   %cmp1 = icmp slt i32 %cond, 1
698   %sub9 = sub nsw i32 0, %cond
699   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
700   ret i32 %cond18
701 ; CHECK-LABEL: @abs_nabs_x15(
702 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
703 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
704 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
705 ; CHECK-NEXT: ret i32 [[SEL]]
706 }
707
708 define i32 @abs_nabs_x16(i32 %x) {
709   %cmp = icmp slt i32 %x, 1
710   %sub = sub nsw i32 0, %x
711   %cond = select i1 %cmp, i32 %x, i32 %sub
712   %cmp1 = icmp slt i32 %cond, 1
713   %sub9 = sub nsw i32 0, %cond
714   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
715   ret i32 %cond18
716 ; CHECK-LABEL: @abs_nabs_x16(
717 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
718 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
719 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
720 ; CHECK-NEXT: ret i32 [[SEL]]
721 }
722
723 define i32 @nabs_abs_x01(i32 %x) {
724   %cmp = icmp sgt i32 %x, -1
725   %sub = sub nsw i32 0, %x
726   %cond = select i1 %cmp, i32 %x, i32 %sub
727   %cmp1 = icmp sgt i32 %cond, -1
728   %sub9 = sub nsw i32 0, %cond
729   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
730   ret i32 %cond18
731 ; CHECK-LABEL: @nabs_abs_x01(
732 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
733 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
734 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
735 ; CHECK-NEXT: ret i32 [[SEL]]
736 }
737
738 define i32 @nabs_abs_x02(i32 %x) {
739   %cmp = icmp sgt i32 %x, 0
740   %sub = sub nsw i32 0, %x
741   %cond = select i1 %cmp, i32 %x, i32 %sub
742   %cmp1 = icmp sgt i32 %cond, -1
743   %sub9 = sub nsw i32 0, %cond
744   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
745   ret i32 %cond18
746 ; CHECK-LABEL: @nabs_abs_x02(
747 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
748 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
749 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
750 ; CHECK-NEXT: ret i32 [[SEL]]
751 }
752
753 define i32 @nabs_abs_x03(i32 %x) {
754   %cmp = icmp slt i32 %x, 0
755   %sub = sub nsw i32 0, %x
756   %cond = select i1 %cmp, i32 %sub, i32 %x
757   %cmp1 = icmp sgt i32 %cond, -1
758   %sub9 = sub nsw i32 0, %cond
759   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
760   ret i32 %cond18
761 ; CHECK-LABEL: @nabs_abs_x03(
762 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
763 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
764 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
765 ; CHECK-NEXT: ret i32 [[SEL]]
766 }
767
768 define i32 @nabs_abs_x04(i32 %x) {
769   %cmp = icmp slt i32 %x, 1
770   %sub = sub nsw i32 0, %x
771   %cond = select i1 %cmp, i32 %sub, i32 %x
772   %cmp1 = icmp sgt i32 %cond, -1
773   %sub9 = sub nsw i32 0, %cond
774   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
775   ret i32 %cond18
776 ; CHECK-LABEL: @nabs_abs_x04(
777 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
778 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
779 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
780 ; CHECK-NEXT: ret i32 [[SEL]]
781 }
782
783 define i32 @nabs_abs_x05(i32 %x) {
784   %cmp = icmp sgt i32 %x, -1
785   %sub = sub nsw i32 0, %x
786   %cond = select i1 %cmp, i32 %x, i32 %sub
787   %cmp1 = icmp sgt i32 %cond, 0
788   %sub9 = sub nsw i32 0, %cond
789   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
790   ret i32 %cond18
791 ; CHECK-LABEL: @nabs_abs_x05(
792 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
793 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
794 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
795 ; CHECK-NEXT: ret i32 [[SEL]]
796 }
797
798 define i32 @nabs_abs_x06(i32 %x) {
799   %cmp = icmp sgt i32 %x, 0
800   %sub = sub nsw i32 0, %x
801   %cond = select i1 %cmp, i32 %x, i32 %sub
802   %cmp1 = icmp sgt i32 %cond, 0
803   %sub9 = sub nsw i32 0, %cond
804   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
805   ret i32 %cond18
806 ; CHECK-LABEL: @nabs_abs_x06(
807 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
808 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
809 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
810 ; CHECK-NEXT: ret i32 [[SEL]]
811 }
812
813 define i32 @nabs_abs_x07(i32 %x) {
814   %cmp = icmp slt i32 %x, 0
815   %sub = sub nsw i32 0, %x
816   %cond = select i1 %cmp, i32 %sub, i32 %x
817   %cmp1 = icmp sgt i32 %cond, 0
818   %sub9 = sub nsw i32 0, %cond
819   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
820   ret i32 %cond18
821 ; CHECK-LABEL: @nabs_abs_x07(
822 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
823 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
824 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
825 ; CHECK-NEXT: ret i32 [[SEL]]
826 }
827
828 define i32 @nabs_abs_x08(i32 %x) {
829   %cmp = icmp slt i32 %x, 1
830   %sub = sub nsw i32 0, %x
831   %cond = select i1 %cmp, i32 %sub, i32 %x
832   %cmp1 = icmp sgt i32 %cond, 0
833   %sub9 = sub nsw i32 0, %cond
834   %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
835   ret i32 %cond18
836 ; CHECK-LABEL: @nabs_abs_x08(
837 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
838 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
839 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
840 ; CHECK-NEXT: ret i32 [[SEL]]
841 }
842
843 define i32 @nabs_abs_x09(i32 %x) {
844   %cmp = icmp sgt i32 %x, -1
845   %sub = sub nsw i32 0, %x
846   %cond = select i1 %cmp, i32 %x, i32 %sub
847   %cmp1 = icmp slt i32 %cond, 0
848   %sub16 = sub nsw i32 0, %cond
849   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
850   ret i32 %cond18
851 ; CHECK-LABEL: @nabs_abs_x09(
852 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
853 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
854 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
855 ; CHECK-NEXT: ret i32 [[SEL]]
856 }
857
858 define i32 @nabs_abs_x10(i32 %x) {
859   %cmp = icmp sgt i32 %x, 0
860   %sub = sub nsw i32 0, %x
861   %cond = select i1 %cmp, i32 %x, i32 %sub
862   %cmp1 = icmp slt i32 %cond, 0
863   %sub16 = sub nsw i32 0, %cond
864   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
865   ret i32 %cond18
866 ; CHECK-LABEL: @nabs_abs_x10(
867 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
868 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
869 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
870 ; CHECK-NEXT: ret i32 [[SEL]]
871 }
872
873 define i32 @nabs_abs_x11(i32 %x) {
874   %cmp = icmp slt i32 %x, 0
875   %sub = sub nsw i32 0, %x
876   %cond = select i1 %cmp, i32 %sub, i32 %x
877   %cmp1 = icmp slt i32 %cond, 0
878   %sub16 = sub nsw i32 0, %cond
879   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
880   ret i32 %cond18
881 ; CHECK-LABEL: @nabs_abs_x11(
882 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
883 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
884 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
885 ; CHECK-NEXT: ret i32 [[SEL]]
886 }
887
888 define i32 @nabs_abs_x12(i32 %x) {
889   %cmp = icmp slt i32 %x, 1
890   %sub = sub nsw i32 0, %x
891   %cond = select i1 %cmp, i32 %sub, i32 %x
892   %cmp1 = icmp slt i32 %cond, 0
893   %sub16 = sub nsw i32 0, %cond
894   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
895   ret i32 %cond18
896 ; CHECK-LABEL: @nabs_abs_x12(
897 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
898 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
899 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
900 ; CHECK-NEXT: ret i32 [[SEL]]
901 }
902
903 define i32 @nabs_abs_x13(i32 %x) {
904   %cmp = icmp sgt i32 %x, -1
905   %sub = sub nsw i32 0, %x
906   %cond = select i1 %cmp, i32 %x, i32 %sub
907   %cmp1 = icmp slt i32 %cond, 1
908   %sub16 = sub nsw i32 0, %cond
909   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
910   ret i32 %cond18
911 ; CHECK-LABEL: @nabs_abs_x13(
912 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, -1
913 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
914 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
915 ; CHECK-NEXT: ret i32 [[SEL]]
916 }
917
918 define i32 @nabs_abs_x14(i32 %x) {
919   %cmp = icmp sgt i32 %x, 0
920   %sub = sub nsw i32 0, %x
921   %cond = select i1 %cmp, i32 %x, i32 %sub
922   %cmp1 = icmp slt i32 %cond, 1
923   %sub16 = sub nsw i32 0, %cond
924   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
925   ret i32 %cond18
926 ; CHECK-LABEL: @nabs_abs_x14(
927 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 0
928 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
929 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[NEG]], i32 %x
930 ; CHECK-NEXT: ret i32 [[SEL]]
931 }
932
933 define i32 @nabs_abs_x15(i32 %x) {
934   %cmp = icmp slt i32 %x, 0
935   %sub = sub nsw i32 0, %x
936   %cond = select i1 %cmp, i32 %sub, i32 %x
937   %cmp1 = icmp slt i32 %cond, 1
938   %sub16 = sub nsw i32 0, %cond
939   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
940   ret i32 %cond18
941 ; CHECK-LABEL: @nabs_abs_x15(
942 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 0
943 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
944 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
945 ; CHECK-NEXT: ret i32 [[SEL]]
946 }
947
948 define i32 @nabs_abs_x16(i32 %x) {
949   %cmp = icmp slt i32 %x, 1
950   %sub = sub nsw i32 0, %x
951   %cond = select i1 %cmp, i32 %sub, i32 %x
952   %cmp1 = icmp slt i32 %cond, 1
953   %sub16 = sub nsw i32 0, %cond
954   %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
955   ret i32 %cond18
956 ; CHECK-LABEL: @nabs_abs_x16(
957 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 1
958 ; CHECK-NEXT: [[NEG:%[a-z0-9]+]] = sub nsw i32 0, %x
959 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 %x, i32 [[NEG]]
960 ; CHECK-NEXT: ret i32 [[SEL]]
961 }