xref: /llvm-project/llvm/test/Transforms/InstCombine/abs_abs.ll (revision 2caaec65c04ea7d0e9568b7895b7a46d6100cb75)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i32 @abs_abs_x01(i32 %x) {
5; CHECK-LABEL: @abs_abs_x01(
6; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
7; CHECK-NEXT:    ret i32 [[COND]]
8;
9  %cmp = icmp sgt i32 %x, -1
10  %sub = sub nsw i32 0, %x
11  %cond = select i1 %cmp, i32 %x, i32 %sub
12  %cmp1 = icmp sgt i32 %cond, -1
13  %sub16 = sub nsw i32 0, %cond
14  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
15  ret i32 %cond18
16}
17
18define <2 x i32> @abs_abs_x01_vec(<2 x i32> %x) {
19; CHECK-LABEL: @abs_abs_x01_vec(
20; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)
21; CHECK-NEXT:    ret <2 x i32> [[COND]]
22;
23  %cmp = icmp sgt <2 x i32> %x, <i32 -1, i32 -1>
24  %sub = sub nsw <2 x i32> zeroinitializer, %x
25  %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub
26  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
27  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
28  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
29  ret <2 x i32> %cond18
30}
31
32define i32 @abs_abs_x02(i32 %x) {
33; CHECK-LABEL: @abs_abs_x02(
34; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
35; CHECK-NEXT:    ret i32 [[COND]]
36;
37  %cmp = icmp sgt i32 %x, 0
38  %sub = sub nsw i32 0, %x
39  %cond = select i1 %cmp, i32 %x, i32 %sub
40  %cmp1 = icmp sgt i32 %cond, -1
41  %sub16 = sub nsw i32 0, %cond
42  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
43  ret i32 %cond18
44}
45
46define i32 @abs_abs_x03(i32 %x) {
47; CHECK-LABEL: @abs_abs_x03(
48; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
49; CHECK-NEXT:    ret i32 [[COND]]
50;
51  %cmp = icmp slt i32 %x, 0
52  %sub = sub nsw i32 0, %x
53  %cond = select i1 %cmp, i32 %sub, i32 %x
54  %cmp1 = icmp sgt i32 %cond, -1
55  %sub16 = sub nsw i32 0, %cond
56  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
57  ret i32 %cond18
58}
59
60define i32 @abs_abs_x04(i32 %x) {
61; CHECK-LABEL: @abs_abs_x04(
62; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
63; CHECK-NEXT:    ret i32 [[COND]]
64;
65  %cmp = icmp slt i32 %x, 1
66  %sub = sub nsw i32 0, %x
67  %cond = select i1 %cmp, i32 %sub, i32 %x
68  %cmp1 = icmp sgt i32 %cond, -1
69  %sub16 = sub nsw i32 0, %cond
70  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
71  ret i32 %cond18
72}
73
74define <2 x i32> @abs_abs_x04_vec(<2 x i32> %x) {
75; CHECK-LABEL: @abs_abs_x04_vec(
76; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)
77; CHECK-NEXT:    ret <2 x i32> [[COND]]
78;
79  %cmp = icmp slt <2 x i32> %x, <i32 1, i32 1>
80  %sub = sub nsw <2 x i32> zeroinitializer, %x
81  %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x
82  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
83  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
84  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
85  ret <2 x i32> %cond18
86}
87
88define i32 @abs_abs_x05(i32 %x) {
89; CHECK-LABEL: @abs_abs_x05(
90; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
91; CHECK-NEXT:    ret i32 [[COND]]
92;
93  %cmp = icmp sgt i32 %x, -1
94  %sub = sub nsw i32 0, %x
95  %cond = select i1 %cmp, i32 %x, i32 %sub
96  %cmp1 = icmp sgt i32 %cond, 0
97  %sub16 = sub nsw i32 0, %cond
98  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
99  ret i32 %cond18
100}
101
102define i32 @abs_abs_x06(i32 %x) {
103; CHECK-LABEL: @abs_abs_x06(
104; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
105; CHECK-NEXT:    ret i32 [[COND]]
106;
107  %cmp = icmp sgt i32 %x, 0
108  %sub = sub nsw i32 0, %x
109  %cond = select i1 %cmp, i32 %x, i32 %sub
110  %cmp1 = icmp sgt i32 %cond, 0
111  %sub16 = sub nsw i32 0, %cond
112  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
113  ret i32 %cond18
114}
115
116define i32 @abs_abs_x07(i32 %x) {
117; CHECK-LABEL: @abs_abs_x07(
118; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
119; CHECK-NEXT:    ret i32 [[COND]]
120;
121  %cmp = icmp slt i32 %x, 0
122  %sub = sub nsw i32 0, %x
123  %cond = select i1 %cmp, i32 %sub, i32 %x
124  %cmp1 = icmp sgt i32 %cond, 0
125  %sub16 = sub nsw i32 0, %cond
126  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
127  ret i32 %cond18
128}
129
130define i32 @abs_abs_x08(i32 %x) {
131; CHECK-LABEL: @abs_abs_x08(
132; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
133; CHECK-NEXT:    ret i32 [[COND]]
134;
135  %cmp = icmp slt i32 %x, 1
136  %sub = sub nsw i32 0, %x
137  %cond = select i1 %cmp, i32 %sub, i32 %x
138  %cmp1 = icmp sgt i32 %cond, 0
139  %sub16 = sub nsw i32 0, %cond
140  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
141  ret i32 %cond18
142}
143
144define i32 @abs_abs_x09(i32 %x) {
145; CHECK-LABEL: @abs_abs_x09(
146; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
147; CHECK-NEXT:    ret i32 [[COND]]
148;
149  %cmp = icmp sgt i32 %x, -1
150  %sub = sub nsw i32 0, %x
151  %cond = select i1 %cmp, i32 %x, i32 %sub
152  %cmp1 = icmp slt i32 %cond, 0
153  %sub9 = sub nsw i32 0, %cond
154  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
155  ret i32 %cond18
156}
157
158define i32 @abs_abs_x10(i32 %x) {
159; CHECK-LABEL: @abs_abs_x10(
160; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
161; CHECK-NEXT:    ret i32 [[COND]]
162;
163  %cmp = icmp sgt i32 %x, 0
164  %sub = sub nsw i32 0, %x
165  %cond = select i1 %cmp, i32 %x, i32 %sub
166  %cmp1 = icmp slt i32 %cond, 0
167  %sub9 = sub nsw i32 0, %cond
168  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
169  ret i32 %cond18
170}
171
172define i32 @abs_abs_x11(i32 %x) {
173; CHECK-LABEL: @abs_abs_x11(
174; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
175; CHECK-NEXT:    ret i32 [[COND]]
176;
177  %cmp = icmp slt i32 %x, 0
178  %sub = sub nsw i32 0, %x
179  %cond = select i1 %cmp, i32 %sub, i32 %x
180  %cmp1 = icmp slt i32 %cond, 0
181  %sub9 = sub nsw i32 0, %cond
182  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
183  ret i32 %cond18
184}
185
186define i32 @abs_abs_x12(i32 %x) {
187; CHECK-LABEL: @abs_abs_x12(
188; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
189; CHECK-NEXT:    ret i32 [[COND]]
190;
191  %cmp = icmp slt i32 %x, 1
192  %sub = sub nsw i32 0, %x
193  %cond = select i1 %cmp, i32 %sub, i32 %x
194  %cmp1 = icmp slt i32 %cond, 0
195  %sub9 = sub nsw i32 0, %cond
196  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
197  ret i32 %cond18
198}
199
200define i32 @abs_abs_x13(i32 %x) {
201; CHECK-LABEL: @abs_abs_x13(
202; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
203; CHECK-NEXT:    ret i32 [[COND]]
204;
205  %cmp = icmp sgt i32 %x, -1
206  %sub = sub nsw i32 0, %x
207  %cond = select i1 %cmp, i32 %x, i32 %sub
208  %cmp1 = icmp slt i32 %cond, 1
209  %sub9 = sub nsw i32 0, %cond
210  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
211  ret i32 %cond18
212}
213
214define i32 @abs_abs_x14(i32 %x) {
215; CHECK-LABEL: @abs_abs_x14(
216; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
217; CHECK-NEXT:    ret i32 [[COND]]
218;
219  %cmp = icmp sgt i32 %x, 0
220  %sub = sub nsw i32 0, %x
221  %cond = select i1 %cmp, i32 %x, i32 %sub
222  %cmp1 = icmp slt i32 %cond, 1
223  %sub9 = sub nsw i32 0, %cond
224  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
225  ret i32 %cond18
226}
227
228define i32 @abs_abs_x15(i32 %x) {
229; CHECK-LABEL: @abs_abs_x15(
230; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
231; CHECK-NEXT:    ret i32 [[COND]]
232;
233  %cmp = icmp slt i32 %x, 0
234  %sub = sub nsw i32 0, %x
235  %cond = select i1 %cmp, i32 %sub, i32 %x
236  %cmp1 = icmp slt i32 %cond, 1
237  %sub9 = sub nsw i32 0, %cond
238  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
239  ret i32 %cond18
240}
241
242define i32 @abs_abs_x16(i32 %x) {
243; CHECK-LABEL: @abs_abs_x16(
244; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
245; CHECK-NEXT:    ret i32 [[COND]]
246;
247  %cmp = icmp slt i32 %x, 1
248  %sub = sub nsw i32 0, %x
249  %cond = select i1 %cmp, i32 %sub, i32 %x
250  %cmp1 = icmp slt i32 %cond, 1
251  %sub9 = sub nsw i32 0, %cond
252  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
253  ret i32 %cond18
254}
255
256; abs(abs(-x)) -> abs(-x) -> abs(x)
257define i32 @abs_abs_x17(i32 %x) {
258; CHECK-LABEL: @abs_abs_x17(
259; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
260; CHECK-NEXT:    ret i32 [[COND]]
261;
262  %sub = sub nsw i32 0, %x
263  %cmp = icmp sgt i32 %sub, -1
264  %cond = select i1 %cmp, i32 %sub, i32 %x
265  %cmp1 = icmp sgt i32 %cond, -1
266  %sub16 = sub nsw i32 0, %cond
267  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
268  ret i32 %cond18
269}
270
271; abs(abs(x - y)) -> abs(x - y)
272define i32 @abs_abs_x18(i32 %x, i32 %y) {
273; CHECK-LABEL: @abs_abs_x18(
274; CHECK-NEXT:    [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
275; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)
276; CHECK-NEXT:    ret i32 [[COND]]
277;
278  %a = sub nsw i32 %x, %y
279  %b = sub nsw i32 %y, %x
280  %cmp = icmp sgt i32 %a, -1
281  %cond = select i1 %cmp, i32 %a, i32 %b
282  %cmp1 = icmp sgt i32 %cond, -1
283  %sub16 = sub nsw i32 0, %cond
284  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
285  ret i32 %cond18
286}
287
288; abs(abs(-x)) -> abs(-x) -> abs(x)
289define <2 x i32> @abs_abs_x02_vec(<2 x i32> %x) {
290; CHECK-LABEL: @abs_abs_x02_vec(
291; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)
292; CHECK-NEXT:    ret <2 x i32> [[COND]]
293;
294  %sub = sub nsw <2 x i32> zeroinitializer, %x
295  %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>
296  %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x
297  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
298  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
299  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
300  ret <2 x i32> %cond18
301}
302
303; abs(abs(x - y)) -> abs(x - y)
304define <2 x i32> @abs_abs_x03_vec(<2 x i32> %x, <2 x i32> %y) {
305; CHECK-LABEL: @abs_abs_x03_vec(
306; CHECK-NEXT:    [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
307; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)
308; CHECK-NEXT:    ret <2 x i32> [[COND]]
309;
310  %a = sub nsw <2 x i32> %x, %y
311  %b = sub nsw <2 x i32> %y, %x
312  %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>
313  %cond = select <2 x i1> %cmp, <2 x i32> %a, <2 x i32> %b
314  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
315  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
316  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
317  ret <2 x i32> %cond18
318}
319
320define i32 @nabs_nabs_x01(i32 %x) {
321; CHECK-LABEL: @nabs_nabs_x01(
322; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
323; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
324; CHECK-NEXT:    ret i32 [[COND18]]
325;
326  %cmp = icmp sgt i32 %x, -1
327  %sub = sub nsw i32 0, %x
328  %cond = select i1 %cmp, i32 %sub, i32 %x
329  %cmp1 = icmp sgt i32 %cond, -1
330  %sub9 = sub nsw i32 0, %cond
331  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
332  ret i32 %cond18
333}
334
335define i32 @nabs_nabs_x02(i32 %x) {
336; CHECK-LABEL: @nabs_nabs_x02(
337; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
338; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
339; CHECK-NEXT:    ret i32 [[COND18]]
340;
341  %cmp = icmp sgt i32 %x, 0
342  %sub = sub nsw i32 0, %x
343  %cond = select i1 %cmp, i32 %sub, i32 %x
344  %cmp1 = icmp sgt i32 %cond, -1
345  %sub9 = sub nsw i32 0, %cond
346  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
347  ret i32 %cond18
348}
349
350define i32 @nabs_nabs_x03(i32 %x) {
351; CHECK-LABEL: @nabs_nabs_x03(
352; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
353; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
354; CHECK-NEXT:    ret i32 [[COND18]]
355;
356  %cmp = icmp slt i32 %x, 0
357  %sub = sub nsw i32 0, %x
358  %cond = select i1 %cmp, i32 %x, i32 %sub
359  %cmp1 = icmp sgt i32 %cond, -1
360  %sub9 = sub nsw i32 0, %cond
361  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
362  ret i32 %cond18
363}
364
365define i32 @nabs_nabs_x04(i32 %x) {
366; CHECK-LABEL: @nabs_nabs_x04(
367; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
368; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
369; CHECK-NEXT:    ret i32 [[COND18]]
370;
371  %cmp = icmp slt i32 %x, 1
372  %sub = sub nsw i32 0, %x
373  %cond = select i1 %cmp, i32 %x, i32 %sub
374  %cmp1 = icmp sgt i32 %cond, -1
375  %sub9 = sub nsw i32 0, %cond
376  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
377  ret i32 %cond18
378}
379
380define i32 @nabs_nabs_x05(i32 %x) {
381; CHECK-LABEL: @nabs_nabs_x05(
382; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
383; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
384; CHECK-NEXT:    ret i32 [[COND18]]
385;
386  %cmp = icmp sgt i32 %x, -1
387  %sub = sub nsw i32 0, %x
388  %cond = select i1 %cmp, i32 %sub, i32 %x
389  %cmp1 = icmp sgt i32 %cond, 0
390  %sub9 = sub nsw i32 0, %cond
391  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
392  ret i32 %cond18
393}
394
395define i32 @nabs_nabs_x06(i32 %x) {
396; CHECK-LABEL: @nabs_nabs_x06(
397; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
398; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
399; CHECK-NEXT:    ret i32 [[COND18]]
400;
401  %cmp = icmp sgt i32 %x, 0
402  %sub = sub nsw i32 0, %x
403  %cond = select i1 %cmp, i32 %sub, i32 %x
404  %cmp1 = icmp sgt i32 %cond, 0
405  %sub9 = sub nsw i32 0, %cond
406  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
407  ret i32 %cond18
408}
409
410define i32 @nabs_nabs_x07(i32 %x) {
411; CHECK-LABEL: @nabs_nabs_x07(
412; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
413; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
414; CHECK-NEXT:    ret i32 [[COND18]]
415;
416  %cmp = icmp slt i32 %x, 0
417  %sub = sub nsw i32 0, %x
418  %cond = select i1 %cmp, i32 %x, i32 %sub
419  %cmp1 = icmp sgt i32 %cond, 0
420  %sub9 = sub nsw i32 0, %cond
421  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
422  ret i32 %cond18
423}
424
425define i32 @nabs_nabs_x08(i32 %x) {
426; CHECK-LABEL: @nabs_nabs_x08(
427; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
428; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
429; CHECK-NEXT:    ret i32 [[COND18]]
430;
431  %cmp = icmp slt i32 %x, 1
432  %sub = sub nsw i32 0, %x
433  %cond = select i1 %cmp, i32 %x, i32 %sub
434  %cmp1 = icmp sgt i32 %cond, 0
435  %sub9 = sub nsw i32 0, %cond
436  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
437  ret i32 %cond18
438}
439
440define i32 @nabs_nabs_x09(i32 %x) {
441; CHECK-LABEL: @nabs_nabs_x09(
442; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
443; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
444; CHECK-NEXT:    ret i32 [[COND18]]
445;
446  %cmp = icmp sgt i32 %x, -1
447  %sub = sub nsw i32 0, %x
448  %cond = select i1 %cmp, i32 %sub, i32 %x
449  %cmp1 = icmp slt i32 %cond, 0
450  %sub16 = sub nsw i32 0, %cond
451  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
452  ret i32 %cond18
453}
454
455define i32 @nabs_nabs_x10(i32 %x) {
456; CHECK-LABEL: @nabs_nabs_x10(
457; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
458; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
459; CHECK-NEXT:    ret i32 [[COND18]]
460;
461  %cmp = icmp sgt i32 %x, 0
462  %sub = sub nsw i32 0, %x
463  %cond = select i1 %cmp, i32 %sub, i32 %x
464  %cmp1 = icmp slt i32 %cond, 0
465  %sub16 = sub nsw i32 0, %cond
466  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
467  ret i32 %cond18
468}
469
470define i32 @nabs_nabs_x11(i32 %x) {
471; CHECK-LABEL: @nabs_nabs_x11(
472; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
473; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
474; CHECK-NEXT:    ret i32 [[COND18]]
475;
476  %cmp = icmp slt i32 %x, 0
477  %sub = sub nsw i32 0, %x
478  %cond = select i1 %cmp, i32 %x, i32 %sub
479  %cmp1 = icmp slt i32 %cond, 0
480  %sub16 = sub nsw i32 0, %cond
481  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
482  ret i32 %cond18
483}
484
485define i32 @nabs_nabs_x12(i32 %x) {
486; CHECK-LABEL: @nabs_nabs_x12(
487; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
488; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
489; CHECK-NEXT:    ret i32 [[COND18]]
490;
491  %cmp = icmp slt i32 %x, 1
492  %sub = sub nsw i32 0, %x
493  %cond = select i1 %cmp, i32 %x, i32 %sub
494  %cmp1 = icmp slt i32 %cond, 0
495  %sub16 = sub nsw i32 0, %cond
496  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
497  ret i32 %cond18
498}
499
500define i32 @nabs_nabs_x13(i32 %x) {
501; CHECK-LABEL: @nabs_nabs_x13(
502; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
503; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
504; CHECK-NEXT:    ret i32 [[COND18]]
505;
506  %cmp = icmp sgt i32 %x, -1
507  %sub = sub nsw i32 0, %x
508  %cond = select i1 %cmp, i32 %sub, i32 %x
509  %cmp1 = icmp slt i32 %cond, 1
510  %sub16 = sub nsw i32 0, %cond
511  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
512  ret i32 %cond18
513}
514
515define i32 @nabs_nabs_x14(i32 %x) {
516; CHECK-LABEL: @nabs_nabs_x14(
517; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
518; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
519; CHECK-NEXT:    ret i32 [[COND18]]
520;
521  %cmp = icmp sgt i32 %x, 0
522  %sub = sub nsw i32 0, %x
523  %cond = select i1 %cmp, i32 %sub, i32 %x
524  %cmp1 = icmp slt i32 %cond, 1
525  %sub16 = sub nsw i32 0, %cond
526  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
527  ret i32 %cond18
528}
529
530define i32 @nabs_nabs_x15(i32 %x) {
531; CHECK-LABEL: @nabs_nabs_x15(
532; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
533; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
534; CHECK-NEXT:    ret i32 [[COND18]]
535;
536  %cmp = icmp slt i32 %x, 0
537  %sub = sub nsw i32 0, %x
538  %cond = select i1 %cmp, i32 %x, i32 %sub
539  %cmp1 = icmp slt i32 %cond, 1
540  %sub16 = sub nsw i32 0, %cond
541  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
542  ret i32 %cond18
543}
544
545define i32 @nabs_nabs_x16(i32 %x) {
546; CHECK-LABEL: @nabs_nabs_x16(
547; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
548; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
549; CHECK-NEXT:    ret i32 [[COND18]]
550;
551  %cmp = icmp slt i32 %x, 1
552  %sub = sub nsw i32 0, %x
553  %cond = select i1 %cmp, i32 %x, i32 %sub
554  %cmp1 = icmp slt i32 %cond, 1
555  %sub16 = sub nsw i32 0, %cond
556  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
557  ret i32 %cond18
558}
559
560; nabs(nabs(-x)) -> nabs(-x) -> nabs(x)
561define i32 @nabs_nabs_x17(i32 %x) {
562; CHECK-LABEL: @nabs_nabs_x17(
563; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
564; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
565; CHECK-NEXT:    ret i32 [[COND18]]
566;
567  %sub = sub nsw i32 0, %x
568  %cmp = icmp sgt i32 %sub, -1
569  %cond = select i1 %cmp, i32 %x, i32 %sub
570  %cmp1 = icmp sgt i32 %cond, -1
571  %sub16 = sub nsw i32 0, %cond
572  %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond
573  ret i32 %cond18
574}
575
576; nabs(nabs(x - y)) -> nabs(x - y)
577define i32 @nabs_nabs_x18(i32 %x, i32 %y) {
578; CHECK-LABEL: @nabs_nabs_x18(
579; CHECK-NEXT:    [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
580; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)
581; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[TMP1]]
582; CHECK-NEXT:    ret i32 [[COND18]]
583;
584  %a = sub nsw i32 %x, %y
585  %b = sub nsw i32 %y, %x
586  %cmp = icmp sgt i32 %a, -1
587  %cond = select i1 %cmp, i32 %b, i32 %a
588  %cmp1 = icmp sgt i32 %cond, -1
589  %sub16 = sub nsw i32 0, %cond
590  %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond
591  ret i32 %cond18
592}
593
594; nabs(nabs(-x)) -> nabs(-x) -> nabs(x)
595define <2 x i32> @nabs_nabs_x01_vec(<2 x i32> %x) {
596; CHECK-LABEL: @nabs_nabs_x01_vec(
597; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 false)
598; CHECK-NEXT:    [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[TMP1]]
599; CHECK-NEXT:    ret <2 x i32> [[COND18]]
600;
601  %sub = sub nsw <2 x i32> zeroinitializer, %x
602  %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>
603  %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub
604  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
605  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
606  %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond
607  ret <2 x i32> %cond18
608}
609
610; nabs(nabs(x - y)) -> nabs(x - y)
611define <2 x i32> @nabs_nabs_x02_vec(<2 x i32> %x, <2 x i32> %y) {
612; CHECK-LABEL: @nabs_nabs_x02_vec(
613; CHECK-NEXT:    [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
614; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)
615; CHECK-NEXT:    [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[TMP1]]
616; CHECK-NEXT:    ret <2 x i32> [[COND18]]
617;
618  %a = sub nsw <2 x i32> %x, %y
619  %b = sub nsw <2 x i32> %y, %x
620  %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>
621  %cond = select <2 x i1> %cmp, <2 x i32> %b, <2 x i32> %a
622  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
623  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
624  %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond
625  ret <2 x i32> %cond18
626}
627
628define i32 @abs_nabs_x01(i32 %x) {
629; CHECK-LABEL: @abs_nabs_x01(
630; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
631; CHECK-NEXT:    ret i32 [[TMP1]]
632;
633  %cmp = icmp sgt i32 %x, -1
634  %sub = sub nsw i32 0, %x
635  %cond = select i1 %cmp, i32 %sub, i32 %x
636  %cmp1 = icmp sgt i32 %cond, -1
637  %sub16 = sub nsw i32 0, %cond
638  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
639  ret i32 %cond18
640}
641
642define i32 @abs_nabs_x02(i32 %x) {
643; CHECK-LABEL: @abs_nabs_x02(
644; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
645; CHECK-NEXT:    ret i32 [[TMP1]]
646;
647  %cmp = icmp sgt i32 %x, 0
648  %sub = sub nsw i32 0, %x
649  %cond = select i1 %cmp, i32 %sub, i32 %x
650  %cmp1 = icmp sgt i32 %cond, -1
651  %sub16 = sub nsw i32 0, %cond
652  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
653  ret i32 %cond18
654}
655
656define i32 @abs_nabs_x03(i32 %x) {
657; CHECK-LABEL: @abs_nabs_x03(
658; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
659; CHECK-NEXT:    ret i32 [[TMP1]]
660;
661  %cmp = icmp slt i32 %x, 0
662  %sub = sub nsw i32 0, %x
663  %cond = select i1 %cmp, i32 %x, i32 %sub
664  %cmp1 = icmp sgt i32 %cond, -1
665  %sub16 = sub nsw i32 0, %cond
666  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
667  ret i32 %cond18
668}
669
670define i32 @abs_nabs_x04(i32 %x) {
671; CHECK-LABEL: @abs_nabs_x04(
672; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
673; CHECK-NEXT:    ret i32 [[TMP1]]
674;
675  %cmp = icmp slt i32 %x, 1
676  %sub = sub nsw i32 0, %x
677  %cond = select i1 %cmp, i32 %x, i32 %sub
678  %cmp1 = icmp sgt i32 %cond, -1
679  %sub16 = sub nsw i32 0, %cond
680  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
681  ret i32 %cond18
682}
683
684define i32 @abs_nabs_x05(i32 %x) {
685; CHECK-LABEL: @abs_nabs_x05(
686; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
687; CHECK-NEXT:    ret i32 [[TMP1]]
688;
689  %cmp = icmp sgt i32 %x, -1
690  %sub = sub nsw i32 0, %x
691  %cond = select i1 %cmp, i32 %sub, i32 %x
692  %cmp1 = icmp sgt i32 %cond, 0
693  %sub16 = sub nsw i32 0, %cond
694  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
695  ret i32 %cond18
696}
697
698define i32 @abs_nabs_x06(i32 %x) {
699; CHECK-LABEL: @abs_nabs_x06(
700; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
701; CHECK-NEXT:    ret i32 [[TMP1]]
702;
703  %cmp = icmp sgt i32 %x, 0
704  %sub = sub nsw i32 0, %x
705  %cond = select i1 %cmp, i32 %sub, i32 %x
706  %cmp1 = icmp sgt i32 %cond, 0
707  %sub16 = sub nsw i32 0, %cond
708  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
709  ret i32 %cond18
710}
711
712define i32 @abs_nabs_x07(i32 %x) {
713; CHECK-LABEL: @abs_nabs_x07(
714; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
715; CHECK-NEXT:    ret i32 [[TMP1]]
716;
717  %cmp = icmp slt i32 %x, 0
718  %sub = sub nsw i32 0, %x
719  %cond = select i1 %cmp, i32 %x, i32 %sub
720  %cmp1 = icmp sgt i32 %cond, 0
721  %sub16 = sub nsw i32 0, %cond
722  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
723  ret i32 %cond18
724}
725
726define i32 @abs_nabs_x08(i32 %x) {
727; CHECK-LABEL: @abs_nabs_x08(
728; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
729; CHECK-NEXT:    ret i32 [[TMP1]]
730;
731  %cmp = icmp slt i32 %x, 1
732  %sub = sub nsw i32 0, %x
733  %cond = select i1 %cmp, i32 %x, i32 %sub
734  %cmp1 = icmp sgt i32 %cond, 0
735  %sub16 = sub nsw i32 0, %cond
736  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
737  ret i32 %cond18
738}
739
740define i32 @abs_nabs_x09(i32 %x) {
741; CHECK-LABEL: @abs_nabs_x09(
742; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
743; CHECK-NEXT:    ret i32 [[TMP1]]
744;
745  %cmp = icmp sgt i32 %x, -1
746  %sub = sub nsw i32 0, %x
747  %cond = select i1 %cmp, i32 %sub, i32 %x
748  %cmp1 = icmp slt i32 %cond, 0
749  %sub9 = sub nsw i32 0, %cond
750  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
751  ret i32 %cond18
752}
753
754define i32 @abs_nabs_x10(i32 %x) {
755; CHECK-LABEL: @abs_nabs_x10(
756; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
757; CHECK-NEXT:    ret i32 [[TMP1]]
758;
759  %cmp = icmp sgt i32 %x, 0
760  %sub = sub nsw i32 0, %x
761  %cond = select i1 %cmp, i32 %sub, i32 %x
762  %cmp1 = icmp slt i32 %cond, 0
763  %sub9 = sub nsw i32 0, %cond
764  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
765  ret i32 %cond18
766}
767
768define i32 @abs_nabs_x11(i32 %x) {
769; CHECK-LABEL: @abs_nabs_x11(
770; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
771; CHECK-NEXT:    ret i32 [[TMP1]]
772;
773  %cmp = icmp slt i32 %x, 0
774  %sub = sub nsw i32 0, %x
775  %cond = select i1 %cmp, i32 %x, i32 %sub
776  %cmp1 = icmp slt i32 %cond, 0
777  %sub9 = sub nsw i32 0, %cond
778  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
779  ret i32 %cond18
780}
781
782define i32 @abs_nabs_x12(i32 %x) {
783; CHECK-LABEL: @abs_nabs_x12(
784; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
785; CHECK-NEXT:    ret i32 [[TMP1]]
786;
787  %cmp = icmp slt i32 %x, 1
788  %sub = sub nsw i32 0, %x
789  %cond = select i1 %cmp, i32 %x, i32 %sub
790  %cmp1 = icmp slt i32 %cond, 0
791  %sub9 = sub nsw i32 0, %cond
792  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
793  ret i32 %cond18
794}
795
796define i32 @abs_nabs_x13(i32 %x) {
797; CHECK-LABEL: @abs_nabs_x13(
798; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
799; CHECK-NEXT:    ret i32 [[TMP1]]
800;
801  %cmp = icmp sgt i32 %x, -1
802  %sub = sub nsw i32 0, %x
803  %cond = select i1 %cmp, i32 %sub, i32 %x
804  %cmp1 = icmp slt i32 %cond, 1
805  %sub9 = sub nsw i32 0, %cond
806  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
807  ret i32 %cond18
808}
809
810define i32 @abs_nabs_x14(i32 %x) {
811; CHECK-LABEL: @abs_nabs_x14(
812; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
813; CHECK-NEXT:    ret i32 [[TMP1]]
814;
815  %cmp = icmp sgt i32 %x, 0
816  %sub = sub nsw i32 0, %x
817  %cond = select i1 %cmp, i32 %sub, i32 %x
818  %cmp1 = icmp slt i32 %cond, 1
819  %sub9 = sub nsw i32 0, %cond
820  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
821  ret i32 %cond18
822}
823
824define i32 @abs_nabs_x15(i32 %x) {
825; CHECK-LABEL: @abs_nabs_x15(
826; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
827; CHECK-NEXT:    ret i32 [[TMP1]]
828;
829  %cmp = icmp slt i32 %x, 0
830  %sub = sub nsw i32 0, %x
831  %cond = select i1 %cmp, i32 %x, i32 %sub
832  %cmp1 = icmp slt i32 %cond, 1
833  %sub9 = sub nsw i32 0, %cond
834  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
835  ret i32 %cond18
836}
837
838define i32 @abs_nabs_x16(i32 %x) {
839; CHECK-LABEL: @abs_nabs_x16(
840; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
841; CHECK-NEXT:    ret i32 [[TMP1]]
842;
843  %cmp = icmp slt i32 %x, 1
844  %sub = sub nsw i32 0, %x
845  %cond = select i1 %cmp, i32 %x, i32 %sub
846  %cmp1 = icmp slt i32 %cond, 1
847  %sub9 = sub nsw i32 0, %cond
848  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
849  ret i32 %cond18
850}
851
852; abs(nabs(-x)) -> abs(-x) -> abs(x)
853define i32 @abs_nabs_x17(i32 %x) {
854; CHECK-LABEL: @abs_nabs_x17(
855; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
856; CHECK-NEXT:    ret i32 [[TMP1]]
857;
858  %sub = sub nsw i32 0, %x
859  %cmp = icmp sgt i32 %sub, -1
860  %cond = select i1 %cmp, i32 %x, i32 %sub
861  %cmp1 = icmp sgt i32 %cond, -1
862  %sub16 = sub nsw i32 0, %cond
863  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
864  ret i32 %cond18
865}
866
867; abs(nabs(x - y)) -> abs(x - y)
868define i32 @abs_nabs_x18(i32 %x, i32 %y) {
869; CHECK-LABEL: @abs_nabs_x18(
870; CHECK-NEXT:    [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
871; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)
872; CHECK-NEXT:    ret i32 [[TMP1]]
873;
874  %a = sub nsw i32 %x, %y
875  %b = sub nsw i32 %y, %x
876  %cmp = icmp sgt i32 %a, -1
877  %cond = select i1 %cmp, i32 %b, i32 %a
878  %cmp1 = icmp sgt i32 %cond, -1
879  %sub16 = sub nsw i32 0, %cond
880  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
881  ret i32 %cond18
882}
883
884; abs(nabs(-x)) -> abs(-x) -> abs(x)
885define <2 x i32> @abs_nabs_x01_vec(<2 x i32> %x) {
886; CHECK-LABEL: @abs_nabs_x01_vec(
887; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 false)
888; CHECK-NEXT:    ret <2 x i32> [[TMP1]]
889;
890  %sub = sub nsw <2 x i32> zeroinitializer, %x
891  %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>
892  %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub
893  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
894  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
895  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
896  ret <2 x i32> %cond18
897}
898
899; abs(nabs(x - y)) -> abs(x - y)
900define <2 x i32> @abs_nabs_x02_vec(<2 x i32> %x, <2 x i32> %y) {
901; CHECK-LABEL: @abs_nabs_x02_vec(
902; CHECK-NEXT:    [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
903; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)
904; CHECK-NEXT:    ret <2 x i32> [[TMP1]]
905;
906  %a = sub nsw <2 x i32> %x, %y
907  %b = sub nsw <2 x i32> %y, %x
908  %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>
909  %cond = select <2 x i1> %cmp, <2 x i32> %b, <2 x i32> %a
910  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
911  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
912  %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16
913  ret <2 x i32> %cond18
914}
915
916define i32 @nabs_abs_x01(i32 %x) {
917; CHECK-LABEL: @nabs_abs_x01(
918; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
919; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
920; CHECK-NEXT:    ret i32 [[SUB9]]
921;
922  %cmp = icmp sgt i32 %x, -1
923  %sub = sub nsw i32 0, %x
924  %cond = select i1 %cmp, i32 %x, i32 %sub
925  %cmp1 = icmp sgt i32 %cond, -1
926  %sub9 = sub nsw i32 0, %cond
927  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
928  ret i32 %cond18
929}
930
931define i32 @nabs_abs_x02(i32 %x) {
932; CHECK-LABEL: @nabs_abs_x02(
933; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
934; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
935; CHECK-NEXT:    ret i32 [[SUB9]]
936;
937  %cmp = icmp sgt i32 %x, 0
938  %sub = sub nsw i32 0, %x
939  %cond = select i1 %cmp, i32 %x, i32 %sub
940  %cmp1 = icmp sgt i32 %cond, -1
941  %sub9 = sub nsw i32 0, %cond
942  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
943  ret i32 %cond18
944}
945
946define i32 @nabs_abs_x03(i32 %x) {
947; CHECK-LABEL: @nabs_abs_x03(
948; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
949; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
950; CHECK-NEXT:    ret i32 [[SUB9]]
951;
952  %cmp = icmp slt i32 %x, 0
953  %sub = sub nsw i32 0, %x
954  %cond = select i1 %cmp, i32 %sub, i32 %x
955  %cmp1 = icmp sgt i32 %cond, -1
956  %sub9 = sub nsw i32 0, %cond
957  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
958  ret i32 %cond18
959}
960
961define i32 @nabs_abs_x04(i32 %x) {
962; CHECK-LABEL: @nabs_abs_x04(
963; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
964; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
965; CHECK-NEXT:    ret i32 [[SUB9]]
966;
967  %cmp = icmp slt i32 %x, 1
968  %sub = sub nsw i32 0, %x
969  %cond = select i1 %cmp, i32 %sub, i32 %x
970  %cmp1 = icmp sgt i32 %cond, -1
971  %sub9 = sub nsw i32 0, %cond
972  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
973  ret i32 %cond18
974}
975
976define i32 @nabs_abs_x05(i32 %x) {
977; CHECK-LABEL: @nabs_abs_x05(
978; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
979; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
980; CHECK-NEXT:    ret i32 [[SUB9]]
981;
982  %cmp = icmp sgt i32 %x, -1
983  %sub = sub nsw i32 0, %x
984  %cond = select i1 %cmp, i32 %x, i32 %sub
985  %cmp1 = icmp sgt i32 %cond, 0
986  %sub9 = sub nsw i32 0, %cond
987  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
988  ret i32 %cond18
989}
990
991define i32 @nabs_abs_x06(i32 %x) {
992; CHECK-LABEL: @nabs_abs_x06(
993; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
994; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
995; CHECK-NEXT:    ret i32 [[SUB9]]
996;
997  %cmp = icmp sgt i32 %x, 0
998  %sub = sub nsw i32 0, %x
999  %cond = select i1 %cmp, i32 %x, i32 %sub
1000  %cmp1 = icmp sgt i32 %cond, 0
1001  %sub9 = sub nsw i32 0, %cond
1002  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
1003  ret i32 %cond18
1004}
1005
1006define i32 @nabs_abs_x07(i32 %x) {
1007; CHECK-LABEL: @nabs_abs_x07(
1008; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1009; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
1010; CHECK-NEXT:    ret i32 [[SUB9]]
1011;
1012  %cmp = icmp slt i32 %x, 0
1013  %sub = sub nsw i32 0, %x
1014  %cond = select i1 %cmp, i32 %sub, i32 %x
1015  %cmp1 = icmp sgt i32 %cond, 0
1016  %sub9 = sub nsw i32 0, %cond
1017  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
1018  ret i32 %cond18
1019}
1020
1021define i32 @nabs_abs_x08(i32 %x) {
1022; CHECK-LABEL: @nabs_abs_x08(
1023; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1024; CHECK-NEXT:    [[SUB9:%.*]] = sub nsw i32 0, [[COND]]
1025; CHECK-NEXT:    ret i32 [[SUB9]]
1026;
1027  %cmp = icmp slt i32 %x, 1
1028  %sub = sub nsw i32 0, %x
1029  %cond = select i1 %cmp, i32 %sub, i32 %x
1030  %cmp1 = icmp sgt i32 %cond, 0
1031  %sub9 = sub nsw i32 0, %cond
1032  %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond
1033  ret i32 %cond18
1034}
1035
1036define i32 @nabs_abs_x09(i32 %x) {
1037; CHECK-LABEL: @nabs_abs_x09(
1038; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1039; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1040; CHECK-NEXT:    ret i32 [[SUB16]]
1041;
1042  %cmp = icmp sgt i32 %x, -1
1043  %sub = sub nsw i32 0, %x
1044  %cond = select i1 %cmp, i32 %x, i32 %sub
1045  %cmp1 = icmp slt i32 %cond, 0
1046  %sub16 = sub nsw i32 0, %cond
1047  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1048  ret i32 %cond18
1049}
1050
1051define i32 @nabs_abs_x10(i32 %x) {
1052; CHECK-LABEL: @nabs_abs_x10(
1053; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1054; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1055; CHECK-NEXT:    ret i32 [[SUB16]]
1056;
1057  %cmp = icmp sgt i32 %x, 0
1058  %sub = sub nsw i32 0, %x
1059  %cond = select i1 %cmp, i32 %x, i32 %sub
1060  %cmp1 = icmp slt i32 %cond, 0
1061  %sub16 = sub nsw i32 0, %cond
1062  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1063  ret i32 %cond18
1064}
1065
1066define i32 @nabs_abs_x11(i32 %x) {
1067; CHECK-LABEL: @nabs_abs_x11(
1068; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1069; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1070; CHECK-NEXT:    ret i32 [[SUB16]]
1071;
1072  %cmp = icmp slt i32 %x, 0
1073  %sub = sub nsw i32 0, %x
1074  %cond = select i1 %cmp, i32 %sub, i32 %x
1075  %cmp1 = icmp slt i32 %cond, 0
1076  %sub16 = sub nsw i32 0, %cond
1077  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1078  ret i32 %cond18
1079}
1080
1081define i32 @nabs_abs_x12(i32 %x) {
1082; CHECK-LABEL: @nabs_abs_x12(
1083; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1084; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1085; CHECK-NEXT:    ret i32 [[SUB16]]
1086;
1087  %cmp = icmp slt i32 %x, 1
1088  %sub = sub nsw i32 0, %x
1089  %cond = select i1 %cmp, i32 %sub, i32 %x
1090  %cmp1 = icmp slt i32 %cond, 0
1091  %sub16 = sub nsw i32 0, %cond
1092  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1093  ret i32 %cond18
1094}
1095
1096define i32 @nabs_abs_x13(i32 %x) {
1097; CHECK-LABEL: @nabs_abs_x13(
1098; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1099; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1100; CHECK-NEXT:    ret i32 [[SUB16]]
1101;
1102  %cmp = icmp sgt i32 %x, -1
1103  %sub = sub nsw i32 0, %x
1104  %cond = select i1 %cmp, i32 %x, i32 %sub
1105  %cmp1 = icmp slt i32 %cond, 1
1106  %sub16 = sub nsw i32 0, %cond
1107  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1108  ret i32 %cond18
1109}
1110
1111define i32 @nabs_abs_x14(i32 %x) {
1112; CHECK-LABEL: @nabs_abs_x14(
1113; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1114; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1115; CHECK-NEXT:    ret i32 [[SUB16]]
1116;
1117  %cmp = icmp sgt i32 %x, 0
1118  %sub = sub nsw i32 0, %x
1119  %cond = select i1 %cmp, i32 %x, i32 %sub
1120  %cmp1 = icmp slt i32 %cond, 1
1121  %sub16 = sub nsw i32 0, %cond
1122  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1123  ret i32 %cond18
1124}
1125
1126define i32 @nabs_abs_x15(i32 %x) {
1127; CHECK-LABEL: @nabs_abs_x15(
1128; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1129; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1130; CHECK-NEXT:    ret i32 [[SUB16]]
1131;
1132  %cmp = icmp slt i32 %x, 0
1133  %sub = sub nsw i32 0, %x
1134  %cond = select i1 %cmp, i32 %sub, i32 %x
1135  %cmp1 = icmp slt i32 %cond, 1
1136  %sub16 = sub nsw i32 0, %cond
1137  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1138  ret i32 %cond18
1139}
1140
1141define i32 @nabs_abs_x16(i32 %x) {
1142; CHECK-LABEL: @nabs_abs_x16(
1143; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1144; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1145; CHECK-NEXT:    ret i32 [[SUB16]]
1146;
1147  %cmp = icmp slt i32 %x, 1
1148  %sub = sub nsw i32 0, %x
1149  %cond = select i1 %cmp, i32 %sub, i32 %x
1150  %cmp1 = icmp slt i32 %cond, 1
1151  %sub16 = sub nsw i32 0, %cond
1152  %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16
1153  ret i32 %cond18
1154}
1155
1156; nabs(abs(-x)) -> nabs(-x) -> nabs(x)
1157define i32 @nabs_abs_x17(i32 %x) {
1158; CHECK-LABEL: @nabs_abs_x17(
1159; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
1160; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1161; CHECK-NEXT:    ret i32 [[SUB16]]
1162;
1163  %sub = sub nsw i32 0, %x
1164  %cmp = icmp sgt i32 %sub, -1
1165  %cond = select i1 %cmp, i32 %sub, i32 %x
1166  %cmp1 = icmp sgt i32 %cond, -1
1167  %sub16 = sub nsw i32 0, %cond
1168  %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond
1169  ret i32 %cond18
1170}
1171
1172; nabs(abs(x - y)) -> nabs(x - y)
1173define i32 @nabs_abs_x18(i32 %x, i32 %y) {
1174; CHECK-LABEL: @nabs_abs_x18(
1175; CHECK-NEXT:    [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
1176; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)
1177; CHECK-NEXT:    [[COND18:%.*]] = sub i32 0, [[COND]]
1178; CHECK-NEXT:    ret i32 [[COND18]]
1179;
1180  %a = sub nsw i32 %x, %y
1181  %b = sub nsw i32 %y, %x
1182  %cmp = icmp sgt i32 %a, -1
1183  %cond = select i1 %cmp, i32 %a, i32 %b
1184  %cmp1 = icmp sgt i32 %cond, -1
1185  %sub16 = sub nsw i32 0, %cond
1186  %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond
1187  ret i32 %cond18
1188}
1189
1190; nabs(abs(-x)) -> nabs(-x) -> nabs(x)
1191define <2 x i32> @nabs_abs_x01_vec(<2 x i32> %x) {
1192; CHECK-LABEL: @nabs_abs_x01_vec(
1193; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)
1194; CHECK-NEXT:    [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
1195; CHECK-NEXT:    ret <2 x i32> [[SUB16]]
1196;
1197  %sub = sub nsw <2 x i32> zeroinitializer, %x
1198  %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>
1199  %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x
1200  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
1201  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
1202  %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond
1203  ret <2 x i32> %cond18
1204}
1205
1206; nabs(abs(x - y)) -> nabs(x - y)
1207define <2 x i32> @nabs_abs_x02_vec(<2 x i32> %x, <2 x i32> %y) {
1208; CHECK-LABEL: @nabs_abs_x02_vec(
1209; CHECK-NEXT:    [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
1210; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)
1211; CHECK-NEXT:    [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[COND]]
1212; CHECK-NEXT:    ret <2 x i32> [[COND18]]
1213;
1214  %a = sub nsw <2 x i32> %x, %y
1215  %b = sub nsw <2 x i32> %y, %x
1216  %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>
1217  %cond = select <2 x i1> %cmp, <2 x i32> %a, <2 x i32> %b
1218  %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>
1219  %sub16 = sub nsw <2 x i32> zeroinitializer, %cond
1220  %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond
1221  ret <2 x i32> %cond18
1222}
1223