xref: /llvm-project/llvm/test/Transforms/CorrelatedValuePropagation/abs.ll (revision 2ad9a658005e6a4204d7ee617c3949632a707aa5)
1b6aaa883SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
3b6aaa883SRoman Lebedev
4b6aaa883SRoman Lebedevdeclare void @llvm.assume(i1)
5*2ad9a658SDianQKdeclare i32 @llvm.abs.i32(i32, i1)
6b50961bdSNikita Popovdeclare i8 @llvm.abs.i8(i8, i1)
7b50961bdSNikita Popovdeclare i1 @llvm.abs.i1(i1, i1)
8b6aaa883SRoman Lebedev
9b6aaa883SRoman Lebedev; If we don't know anything about the argument, we can't do anything.
10b6aaa883SRoman Lebedev
11b6aaa883SRoman Lebedevdefine i8 @test0(i8 %x) {
12b6aaa883SRoman Lebedev; CHECK-LABEL: @test0(
13b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 false)
14b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
15b6aaa883SRoman Lebedev;
16b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
17b6aaa883SRoman Lebedev  ret i8 %r
18b6aaa883SRoman Lebedev}
19b6aaa883SRoman Lebedevdefine i8 @test1(i8 %x) {
20b6aaa883SRoman Lebedev; CHECK-LABEL: @test1(
21b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 true)
22b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
23b6aaa883SRoman Lebedev;
24b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
25b6aaa883SRoman Lebedev  ret i8 %r
26b6aaa883SRoman Lebedev}
27b6aaa883SRoman Lebedev
28b6aaa883SRoman Lebedev; But if we know that the argument is always positive, we can bypass @llvm.abs.
29b6aaa883SRoman Lebedev
30b6aaa883SRoman Lebedevdefine i8 @test2(i8 %x) {
31b6aaa883SRoman Lebedev; CHECK-LABEL: @test2(
32b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], -1
33b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
34c329a47dSRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
35b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
36b6aaa883SRoman Lebedev;
37b6aaa883SRoman Lebedev
38b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, -1
39b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
40b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
41b6aaa883SRoman Lebedev  ret i8 %r
42b6aaa883SRoman Lebedev}
43b6aaa883SRoman Lebedevdefine i8 @test3(i8 %x) {
44b6aaa883SRoman Lebedev; CHECK-LABEL: @test3(
45b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], -1
46b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
47b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
48b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
49b6aaa883SRoman Lebedev;
50b6aaa883SRoman Lebedev
51b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, -1
52b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
53b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
54b6aaa883SRoman Lebedev  ret i8 %r
55b6aaa883SRoman Lebedev}
56b6aaa883SRoman Lebedev
57b6aaa883SRoman Lebedevdefine i8 @test4(i8 %x) {
58b6aaa883SRoman Lebedev; CHECK-LABEL: @test4(
59b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 0
60b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
61c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
62b6aaa883SRoman Lebedev;
63b6aaa883SRoman Lebedev
64b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, 0
65b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
66b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
67b6aaa883SRoman Lebedev  ret i8 %r
68b6aaa883SRoman Lebedev}
69b6aaa883SRoman Lebedevdefine i8 @test5(i8 %x) {
70b6aaa883SRoman Lebedev; CHECK-LABEL: @test5(
71b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 0
72b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
73c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
74b6aaa883SRoman Lebedev;
75b6aaa883SRoman Lebedev
76b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, 0
77b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
78b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
79b6aaa883SRoman Lebedev  ret i8 %r
80b6aaa883SRoman Lebedev}
81b6aaa883SRoman Lebedev
82b6aaa883SRoman Lebedevdefine i8 @test6(i8 %x) {
83b6aaa883SRoman Lebedev; CHECK-LABEL: @test6(
84b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 1
85b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
86c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
87b6aaa883SRoman Lebedev;
88b6aaa883SRoman Lebedev
89b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, 1
90b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
91b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
92b6aaa883SRoman Lebedev  ret i8 %r
93b6aaa883SRoman Lebedev}
94b6aaa883SRoman Lebedevdefine i8 @test7(i8 %x) {
95b6aaa883SRoman Lebedev; CHECK-LABEL: @test7(
96b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 1
97b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
98c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
99b6aaa883SRoman Lebedev;
100b6aaa883SRoman Lebedev
101b6aaa883SRoman Lebedev  %lim = icmp sge i8 %x, 1
102b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
103b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
104b6aaa883SRoman Lebedev  ret i8 %r
105b6aaa883SRoman Lebedev}
106b6aaa883SRoman Lebedev
107b6aaa883SRoman Lebedev; Likewise, INT_MIN is fine for otherwise-positive value.
108b6aaa883SRoman Lebedev
109b6aaa883SRoman Lebedevdefine i8 @test8(i8 %x) {
110b6aaa883SRoman Lebedev; CHECK-LABEL: @test8(
111b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], 127
112b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
113c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
114b6aaa883SRoman Lebedev;
115b6aaa883SRoman Lebedev
116b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 127
117b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
118b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
119b6aaa883SRoman Lebedev  ret i8 %r
120b6aaa883SRoman Lebedev}
121b6aaa883SRoman Lebedevdefine i8 @test9(i8 %x) {
122b6aaa883SRoman Lebedev; CHECK-LABEL: @test9(
123b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], 127
124b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
125c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
126b6aaa883SRoman Lebedev;
127b6aaa883SRoman Lebedev
128b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 127
129b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
130b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
131b6aaa883SRoman Lebedev  ret i8 %r
132b6aaa883SRoman Lebedev}
133b6aaa883SRoman Lebedev
134b6aaa883SRoman Lebedevdefine i8 @test10(i8 %x) {
135b6aaa883SRoman Lebedev; CHECK-LABEL: @test10(
136b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -128
137b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
138c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
139b6aaa883SRoman Lebedev;
140b6aaa883SRoman Lebedev
141b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 128
142b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
143b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
144b6aaa883SRoman Lebedev  ret i8 %r
145b6aaa883SRoman Lebedev}
146b6aaa883SRoman Lebedevdefine i8 @test11(i8 %x) {
147b6aaa883SRoman Lebedev; CHECK-LABEL: @test11(
148b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -128
149b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
150c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[X]]
151b6aaa883SRoman Lebedev;
152b6aaa883SRoman Lebedev
153b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 128
154b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
155b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
156b6aaa883SRoman Lebedev  ret i8 %r
157b6aaa883SRoman Lebedev}
158b6aaa883SRoman Lebedev
159b6aaa883SRoman Lebedevdefine i8 @test12(i8 %x) {
160b6aaa883SRoman Lebedev; CHECK-LABEL: @test12(
161b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -127
162b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
163b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false)
164b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
165b6aaa883SRoman Lebedev;
166b6aaa883SRoman Lebedev
167b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 129
168b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
169b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
170b6aaa883SRoman Lebedev  ret i8 %r
171b6aaa883SRoman Lebedev}
172b6aaa883SRoman Lebedevdefine i8 @test13(i8 %x) {
173b6aaa883SRoman Lebedev; CHECK-LABEL: @test13(
174b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -127
175b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
176b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
177b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
178b6aaa883SRoman Lebedev;
179b6aaa883SRoman Lebedev
180b6aaa883SRoman Lebedev  %lim = icmp ule i8 %x, 129
181b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
182b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
183b6aaa883SRoman Lebedev  ret i8 %r
184b6aaa883SRoman Lebedev}
185b6aaa883SRoman Lebedev
186b6aaa883SRoman Lebedev; Likewise, if we know that argument is always negative,
187b6aaa883SRoman Lebedev; we can expand @llvm.abs into a direct negation.
188b6aaa883SRoman Lebedev; For negative arguments, we must be careful to include 0 though.
189b6aaa883SRoman Lebedev
190b6aaa883SRoman Lebedevdefine i8 @test14(i8 %x) {
191b6aaa883SRoman Lebedev; CHECK-LABEL: @test14(
192b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], -1
193b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
194c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub i8 0, [[X]]
195c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
196b6aaa883SRoman Lebedev;
197b6aaa883SRoman Lebedev
198b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, -1
199b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
200b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
201b6aaa883SRoman Lebedev  ret i8 %r
202b6aaa883SRoman Lebedev}
203b6aaa883SRoman Lebedevdefine i8 @test15(i8 %x) {
204b6aaa883SRoman Lebedev; CHECK-LABEL: @test15(
205b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], -1
206b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
207c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub nsw i8 0, [[X]]
208c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
209b6aaa883SRoman Lebedev;
210b6aaa883SRoman Lebedev
211b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, -1
212b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
213b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
214b6aaa883SRoman Lebedev  ret i8 %r
215b6aaa883SRoman Lebedev}
216b6aaa883SRoman Lebedev
217b6aaa883SRoman Lebedevdefine i8 @test16(i8 %x) {
218b6aaa883SRoman Lebedev; CHECK-LABEL: @test16(
219b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 0
220b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
221c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub i8 0, [[X]]
222c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
223b6aaa883SRoman Lebedev;
224b6aaa883SRoman Lebedev
225b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, 0
226b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
227b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
228b6aaa883SRoman Lebedev  ret i8 %r
229b6aaa883SRoman Lebedev}
230b6aaa883SRoman Lebedevdefine i8 @test17(i8 %x) {
231b6aaa883SRoman Lebedev; CHECK-LABEL: @test17(
232b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 0
233b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
234c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub nsw i8 0, [[X]]
235c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
236b6aaa883SRoman Lebedev;
237b6aaa883SRoman Lebedev
238b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, 0
239b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
240b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
241b6aaa883SRoman Lebedev  ret i8 %r
242b6aaa883SRoman Lebedev}
243b6aaa883SRoman Lebedev
244b6aaa883SRoman Lebedevdefine i8 @test18(i8 %x) {
245b6aaa883SRoman Lebedev; CHECK-LABEL: @test18(
246b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 1
247b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
248b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false)
249b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
250b6aaa883SRoman Lebedev;
251b6aaa883SRoman Lebedev
252b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, 1
253b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
254b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
255b6aaa883SRoman Lebedev  ret i8 %r
256b6aaa883SRoman Lebedev}
257b6aaa883SRoman Lebedevdefine i8 @test19(i8 %x) {
258b6aaa883SRoman Lebedev; CHECK-LABEL: @test19(
259b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 1
260b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
261b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
262b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
263b6aaa883SRoman Lebedev;
264b6aaa883SRoman Lebedev
265b6aaa883SRoman Lebedev  %lim = icmp sle i8 %x, 1
266b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
267b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
268b6aaa883SRoman Lebedev  ret i8 %r
269b6aaa883SRoman Lebedev}
270b6aaa883SRoman Lebedev
271b6aaa883SRoman Lebedev; And again, INT_MIN is also fine for otherwise-negative range.
272b6aaa883SRoman Lebedev
273b6aaa883SRoman Lebedevdefine i8 @test20(i8 %x) {
274b6aaa883SRoman Lebedev; CHECK-LABEL: @test20(
275b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], 127
276b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
277b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false)
278b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
279b6aaa883SRoman Lebedev;
280b6aaa883SRoman Lebedev
281b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 127
282b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
283b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
284b6aaa883SRoman Lebedev  ret i8 %r
285b6aaa883SRoman Lebedev}
286b6aaa883SRoman Lebedevdefine i8 @test21(i8 %x) {
287b6aaa883SRoman Lebedev; CHECK-LABEL: @test21(
288b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], 127
289b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
290b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
291b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
292b6aaa883SRoman Lebedev;
293b6aaa883SRoman Lebedev
294b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 127
295b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
296b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
297b6aaa883SRoman Lebedev  ret i8 %r
298b6aaa883SRoman Lebedev}
299b6aaa883SRoman Lebedev
300b6aaa883SRoman Lebedevdefine i8 @test22(i8 %x) {
301b6aaa883SRoman Lebedev; CHECK-LABEL: @test22(
302b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -128
303b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
304c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub i8 0, [[X]]
305c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
306b6aaa883SRoman Lebedev;
307b6aaa883SRoman Lebedev
308b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 128
309b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
310b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
311b6aaa883SRoman Lebedev  ret i8 %r
312b6aaa883SRoman Lebedev}
313b6aaa883SRoman Lebedevdefine i8 @test23(i8 %x) {
314b6aaa883SRoman Lebedev; CHECK-LABEL: @test23(
315b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -128
316b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
317c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub nsw i8 0, [[X]]
318c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
319b6aaa883SRoman Lebedev;
320b6aaa883SRoman Lebedev
321b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 128
322b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
323b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
324b6aaa883SRoman Lebedev  ret i8 %r
325b6aaa883SRoman Lebedev}
326b6aaa883SRoman Lebedev
327b6aaa883SRoman Lebedevdefine i8 @test24(i8 %x) {
328b6aaa883SRoman Lebedev; CHECK-LABEL: @test24(
329b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -127
330b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
331c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub nsw i8 0, [[X]]
332c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
333b6aaa883SRoman Lebedev;
334b6aaa883SRoman Lebedev
335b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 129
336b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
337b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
338b6aaa883SRoman Lebedev  ret i8 %r
339b6aaa883SRoman Lebedev}
340b6aaa883SRoman Lebedevdefine i8 @test25(i8 %x) {
341b6aaa883SRoman Lebedev; CHECK-LABEL: @test25(
342b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -127
343b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
344c329a47dSRoman Lebedev; CHECK-NEXT:    [[R1:%.*]] = sub nsw i8 0, [[X]]
345c329a47dSRoman Lebedev; CHECK-NEXT:    ret i8 [[R1]]
346b6aaa883SRoman Lebedev;
347b6aaa883SRoman Lebedev
348b6aaa883SRoman Lebedev  %lim = icmp uge i8 %x, 129
349b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
350b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
351b6aaa883SRoman Lebedev  ret i8 %r
352b6aaa883SRoman Lebedev}
353b6aaa883SRoman Lebedev
354b6aaa883SRoman Lebedev; If all else fails, we can sometimes at least inferr NSW.
355b6aaa883SRoman Lebedev
356b6aaa883SRoman Lebedevdefine i8 @test26(i8 %x) {
357b6aaa883SRoman Lebedev; CHECK-LABEL: @test26(
358b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ne i8 [[X:%.*]], -128
359b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
360c329a47dSRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
361b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
362b6aaa883SRoman Lebedev;
363b6aaa883SRoman Lebedev  %lim = icmp ne i8 %x, 128
364b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
365b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 0)
366b6aaa883SRoman Lebedev  ret i8 %r
367b6aaa883SRoman Lebedev}
368b6aaa883SRoman Lebedevdefine i8 @test27(i8 %x) {
369b6aaa883SRoman Lebedev; CHECK-LABEL: @test27(
370b6aaa883SRoman Lebedev; CHECK-NEXT:    [[LIM:%.*]] = icmp ne i8 [[X:%.*]], -128
371b6aaa883SRoman Lebedev; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
372b6aaa883SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)
373b6aaa883SRoman Lebedev; CHECK-NEXT:    ret i8 [[R]]
374b6aaa883SRoman Lebedev;
375b6aaa883SRoman Lebedev  %lim = icmp ne i8 %x, 128
376b6aaa883SRoman Lebedev  call void @llvm.assume(i1 %lim)
377b50961bdSNikita Popov  %r = call i8 @llvm.abs.i8(i8 %x, i1 1)
378b6aaa883SRoman Lebedev  ret i8 %r
379b6aaa883SRoman Lebedev}
380b50961bdSNikita Popov
381b50961bdSNikita Popovdefine i1 @pr59887(i1 %x, i1 %c) {
382b50961bdSNikita Popov; CHECK-LABEL: @pr59887(
383*2ad9a658SDianQK; CHECK-NEXT:    [[RES:%.*]] = select i1 [[C:%.*]], i1 [[X:%.*]], i1 false
384fd07583cSNikita Popov; CHECK-NEXT:    ret i1 [[RES]]
385b50961bdSNikita Popov;
386b50961bdSNikita Popov  %abs = call i1 @llvm.abs.i1(i1 %x, i1 false)
387b50961bdSNikita Popov  %res = select i1 %c, i1 %abs, i1 false
388b50961bdSNikita Popov  ret i1 %res
389b50961bdSNikita Popov}
390*2ad9a658SDianQK
391*2ad9a658SDianQK; Because of `undef`, We can't delete `abs`.
392*2ad9a658SDianQK; We can't replace the `abs` argument with true either.
393*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false(i1 %c0, i1 %c1, i8 %v1) {
394*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false(
395*2ad9a658SDianQK; CHECK-NEXT:  start:
396*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
397*2ad9a658SDianQK; CHECK:       bb0:
398*2ad9a658SDianQK; CHECK-NEXT:    [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32
399*2ad9a658SDianQK; CHECK-NEXT:    br label [[BB1]]
400*2ad9a658SDianQK; CHECK:       bb1:
401*2ad9a658SDianQK; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ]
402*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]]
403*2ad9a658SDianQK; CHECK:       bb2:
404*2ad9a658SDianQK; CHECK-NEXT:    [[Z:%.*]] = call i32 @llvm.abs.i32(i32 [[X]], i1 false)
405*2ad9a658SDianQK; CHECK-NEXT:    ret i32 [[Z]]
406*2ad9a658SDianQK;
407*2ad9a658SDianQKstart:
408*2ad9a658SDianQK  br i1 %c0, label %bb0, label %bb1
409*2ad9a658SDianQK
410*2ad9a658SDianQKbb0:
411*2ad9a658SDianQK  %v1_i32 = zext i8 %v1 to i32
412*2ad9a658SDianQK  br label %bb1
413*2ad9a658SDianQK
414*2ad9a658SDianQKbb1:
415*2ad9a658SDianQK  %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ]
416*2ad9a658SDianQK  br i1 %c1, label %bb0, label %bb2
417*2ad9a658SDianQK
418*2ad9a658SDianQKbb2:
419*2ad9a658SDianQK  %z = call i32 @llvm.abs.i32(i32 %x, i1 false)
420*2ad9a658SDianQK  ret i32 %z
421*2ad9a658SDianQK}
422*2ad9a658SDianQK
423*2ad9a658SDianQK; Because of `and`, we can delete `abs`.
424*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false_and(i1 %c0, i1 %c1, i8 %v1) {
425*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false_and(
426*2ad9a658SDianQK; CHECK-NEXT:  start:
427*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
428*2ad9a658SDianQK; CHECK:       bb0:
429*2ad9a658SDianQK; CHECK-NEXT:    [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32
430*2ad9a658SDianQK; CHECK-NEXT:    br label [[BB1]]
431*2ad9a658SDianQK; CHECK:       bb1:
432*2ad9a658SDianQK; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ]
433*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]]
434*2ad9a658SDianQK; CHECK:       bb2:
435*2ad9a658SDianQK; CHECK-NEXT:    [[Y:%.*]] = and i32 [[X]], 255
436*2ad9a658SDianQK; CHECK-NEXT:    ret i32 [[Y]]
437*2ad9a658SDianQK;
438*2ad9a658SDianQKstart:
439*2ad9a658SDianQK  br i1 %c0, label %bb0, label %bb1
440*2ad9a658SDianQK
441*2ad9a658SDianQKbb0:
442*2ad9a658SDianQK  %v1_i32 = zext i8 %v1 to i32
443*2ad9a658SDianQK  br label %bb1
444*2ad9a658SDianQK
445*2ad9a658SDianQKbb1:
446*2ad9a658SDianQK  %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ]
447*2ad9a658SDianQK  br i1 %c1, label %bb0, label %bb2
448*2ad9a658SDianQK
449*2ad9a658SDianQKbb2:
450*2ad9a658SDianQK  %y = and i32 %x, 255
451*2ad9a658SDianQK  %z = call i32 @llvm.abs.i32(i32 %y, i1 false)
452*2ad9a658SDianQK  ret i32 %z
453*2ad9a658SDianQK}
454*2ad9a658SDianQK
455*2ad9a658SDianQK; Because of `undef`, we can't replace `abs` with `sub`.
456*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false_sub(i1 %c0, i1 %c1, i32 %v1, i32 %v2) {
457*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false_sub(
458*2ad9a658SDianQK; CHECK-NEXT:  start:
459*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
460*2ad9a658SDianQK; CHECK:       bb0:
461*2ad9a658SDianQK; CHECK-NEXT:    [[V3:%.*]] = add i32 [[V1:%.*]], [[V2:%.*]]
462*2ad9a658SDianQK; CHECK-NEXT:    [[LIM:%.*]] = icmp sle i32 [[V3]], -1
463*2ad9a658SDianQK; CHECK-NEXT:    call void @llvm.assume(i1 [[LIM]])
464*2ad9a658SDianQK; CHECK-NEXT:    br label [[BB1]]
465*2ad9a658SDianQK; CHECK:       bb1:
466*2ad9a658SDianQK; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[V3]], [[BB0]] ], [ undef, [[START:%.*]] ]
467*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]]
468*2ad9a658SDianQK; CHECK:       bb2:
469*2ad9a658SDianQK; CHECK-NEXT:    [[Z:%.*]] = call i32 @llvm.abs.i32(i32 [[X]], i1 false)
470*2ad9a658SDianQK; CHECK-NEXT:    ret i32 [[Z]]
471*2ad9a658SDianQK;
472*2ad9a658SDianQKstart:
473*2ad9a658SDianQK  br i1 %c0, label %bb0, label %bb1
474*2ad9a658SDianQK
475*2ad9a658SDianQKbb0:
476*2ad9a658SDianQK  %v3 = add i32 %v1, %v2
477*2ad9a658SDianQK  %lim = icmp sle i32 %v3, -1
478*2ad9a658SDianQK  call void @llvm.assume(i1 %lim)
479*2ad9a658SDianQK  br label %bb1
480*2ad9a658SDianQK
481*2ad9a658SDianQKbb1:
482*2ad9a658SDianQK  %x = phi i32 [ %v3, %bb0 ], [ undef, %start ]
483*2ad9a658SDianQK  br i1 %c1, label %bb0, label %bb2
484*2ad9a658SDianQK
485*2ad9a658SDianQKbb2:
486*2ad9a658SDianQK  %z = call i32 @llvm.abs.i32(i32 %x, i1 false)
487*2ad9a658SDianQK  ret i32 %z
488*2ad9a658SDianQK}
489*2ad9a658SDianQK
490*2ad9a658SDianQK; We can delete `abs`.
491*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_true(i1 %c0, i1 %c1, i8 %v1) {
492*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_true(
493*2ad9a658SDianQK; CHECK-NEXT:  start:
494*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
495*2ad9a658SDianQK; CHECK:       bb0:
496*2ad9a658SDianQK; CHECK-NEXT:    [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32
497*2ad9a658SDianQK; CHECK-NEXT:    br label [[BB1]]
498*2ad9a658SDianQK; CHECK:       bb1:
499*2ad9a658SDianQK; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ]
500*2ad9a658SDianQK; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]]
501*2ad9a658SDianQK; CHECK:       bb2:
502*2ad9a658SDianQK; CHECK-NEXT:    ret i32 [[X]]
503*2ad9a658SDianQK;
504*2ad9a658SDianQKstart:
505*2ad9a658SDianQK  br i1 %c0, label %bb0, label %bb1
506*2ad9a658SDianQK
507*2ad9a658SDianQKbb0:
508*2ad9a658SDianQK  %v1_i32 = zext i8 %v1 to i32
509*2ad9a658SDianQK  br label %bb1
510*2ad9a658SDianQK
511*2ad9a658SDianQKbb1:
512*2ad9a658SDianQK  %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ]
513*2ad9a658SDianQK  br i1 %c1, label %bb0, label %bb2
514*2ad9a658SDianQK
515*2ad9a658SDianQKbb2:
516*2ad9a658SDianQK  %z = call i32 @llvm.abs.i32(i32 %x, i1 true)
517*2ad9a658SDianQK  ret i32 %z
518*2ad9a658SDianQK}
519