xref: /llvm-project/llvm/test/Transforms/InstCombine/free-inversion.ll (revision a105877646d68e48cdeeeadd9d1e075dc3c5d68d)
1742c15adSNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2742c15adSNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3742c15adSNoah Goldstein
4742c15adSNoah Goldsteindeclare i8 @llvm.smin.i8(i8, i8)
5742c15adSNoah Goldsteindeclare i8 @llvm.umin.i8(i8, i8)
6742c15adSNoah Goldsteindeclare i8 @llvm.smax.i8(i8, i8)
7742c15adSNoah Goldsteindeclare i8 @llvm.umax.i8(i8, i8)
8742c15adSNoah Goldstein
9dd5c5349SNikita Popovdeclare void @llvm.assume(i1)
10dd5c5349SNikita Popov
11742c15adSNoah Goldsteindeclare void @use.i8(i8)
127ab0a871SYingwei Zhengdeclare void @use.i1(i1)
13742c15adSNoah Goldstein
14742c15adSNoah Goldsteindefine i8 @xor_1(i8 %a, i1 %c, i8 %x, i8 %y) {
15742c15adSNoah Goldstein; CHECK-LABEL: @xor_1(
163039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
17b7c0f799SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
18b7c0f799SNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = xor i8 [[TMP2]], [[A:%.*]]
19742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
20742c15adSNoah Goldstein;
21742c15adSNoah Goldstein  %nx = xor i8 %x, -1
22742c15adSNoah Goldstein  %yy = xor i8 %y, 123
23742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
24742c15adSNoah Goldstein  %ba = xor i8 %b, %a
25742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
26742c15adSNoah Goldstein  ret i8 %not_ba
27742c15adSNoah Goldstein}
28742c15adSNoah Goldstein
29742c15adSNoah Goldsteindefine i8 @xor_2(i8 %a, i1 %c, i8 %x, i8 %y) {
30742c15adSNoah Goldstein; CHECK-LABEL: @xor_2(
313039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
32b7c0f799SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
33*a1058776SNikita Popov; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[A:%.*]], [[TMP2]]
34742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
35742c15adSNoah Goldstein;
36742c15adSNoah Goldstein  %nx = xor i8 %x, -1
37742c15adSNoah Goldstein  %yy = xor i8 %y, 123
38742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
39742c15adSNoah Goldstein  %ab = xor i8 %a, %b
40742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
41742c15adSNoah Goldstein  ret i8 %not_ab
42742c15adSNoah Goldstein}
43742c15adSNoah Goldstein
44742c15adSNoah Goldsteindefine i8 @xor_fail(i8 %a, i1 %c, i8 %x, i8 %y) {
45742c15adSNoah Goldstein; CHECK-LABEL: @xor_fail(
46742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
47742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[Y:%.*]]
48*a1058776SNikita Popov; CHECK-NEXT:    [[AB:%.*]] = xor i8 [[A:%.*]], [[B]]
49742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[AB]], -1
50742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
51742c15adSNoah Goldstein;
52742c15adSNoah Goldstein  %nx = xor i8 %x, -1
53742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %y
54742c15adSNoah Goldstein  %ab = xor i8 %a, %b
55742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
56742c15adSNoah Goldstein  ret i8 %not_ab
57742c15adSNoah Goldstein}
58742c15adSNoah Goldstein
59742c15adSNoah Goldsteindefine i8 @add_1(i8 %a, i1 %c, i8 %x, i8 %y) {
60742c15adSNoah Goldstein; CHECK-LABEL: @add_1(
613039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
623039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
633039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = sub i8 [[TMP2]], [[A:%.*]]
64742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
65742c15adSNoah Goldstein;
66742c15adSNoah Goldstein  %nx = xor i8 %x, -1
67742c15adSNoah Goldstein  %yy = xor i8 %y, 123
68742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
69742c15adSNoah Goldstein  %ba = add i8 %b, %a
70742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
71742c15adSNoah Goldstein  ret i8 %not_ba
72742c15adSNoah Goldstein}
73742c15adSNoah Goldstein
74742c15adSNoah Goldsteindefine i8 @add_2(i8 %a, i1 %c, i8 %x, i8 %y) {
75742c15adSNoah Goldstein; CHECK-LABEL: @add_2(
763039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
773039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
783039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = sub i8 [[TMP2]], [[A:%.*]]
79742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
80742c15adSNoah Goldstein;
81742c15adSNoah Goldstein  %nx = xor i8 %x, -1
82742c15adSNoah Goldstein  %yy = xor i8 %y, 123
83742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
84742c15adSNoah Goldstein  %ab = add i8 %a, %b
85742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
86742c15adSNoah Goldstein  ret i8 %not_ab
87742c15adSNoah Goldstein}
88742c15adSNoah Goldstein
89742c15adSNoah Goldsteindefine i8 @add_fail(i8 %a, i1 %c, i8 %x, i8 %y) {
90742c15adSNoah Goldstein; CHECK-LABEL: @add_fail(
91742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], [[A:%.*]]
92742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 123
93742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]]
94*a1058776SNikita Popov; CHECK-NEXT:    [[AB:%.*]] = add i8 [[A]], [[B]]
95742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[AB]], -1
96742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
97742c15adSNoah Goldstein;
98742c15adSNoah Goldstein  %nx = xor i8 %x, %a
99742c15adSNoah Goldstein  %yy = xor i8 %y, 123
100742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
101742c15adSNoah Goldstein  %ab = add i8 %a, %b
102742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
103742c15adSNoah Goldstein  ret i8 %not_ab
104742c15adSNoah Goldstein}
105742c15adSNoah Goldstein
106742c15adSNoah Goldsteindefine i8 @sub_1(i8 %a, i1 %c, i8 %x, i8 %y) {
107742c15adSNoah Goldstein; CHECK-LABEL: @sub_1(
1083039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
1093039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
1103039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = add i8 [[TMP2]], [[A:%.*]]
111742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
112742c15adSNoah Goldstein;
113742c15adSNoah Goldstein  %nx = xor i8 %x, -1
114742c15adSNoah Goldstein  %yy = xor i8 %y, 123
115742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
116742c15adSNoah Goldstein  %ba = sub i8 %b, %a
117742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
118742c15adSNoah Goldstein  ret i8 %not_ba
119742c15adSNoah Goldstein}
120742c15adSNoah Goldstein
121742c15adSNoah Goldsteindefine i8 @sub_2(i8 %a, i1 %c, i8 %x, i8 %y) {
122742c15adSNoah Goldstein; CHECK-LABEL: @sub_2(
1235271d330SNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
1245271d330SNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
1255271d330SNoah Goldstein; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[TMP2]], [[A:%.*]]
1265271d330SNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = sub i8 -2, [[TMP3]]
127742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
128742c15adSNoah Goldstein;
129742c15adSNoah Goldstein  %nx = xor i8 %x, -1
130742c15adSNoah Goldstein  %yy = xor i8 %y, 123
131742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
132742c15adSNoah Goldstein  %ab = sub i8 %a, %b
133742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
134742c15adSNoah Goldstein  ret i8 %not_ab
135742c15adSNoah Goldstein}
136742c15adSNoah Goldstein
1377f1c8fc2SCraig Topper; Same as above but with a type larger than i64 to make sure we create -2
1387f1c8fc2SCraig Topper; correctly.
1397f1c8fc2SCraig Topperdefine i128 @sub_3(i128 %a, i1 %c, i128 %x, i128 %y) {
1407f1c8fc2SCraig Topper; CHECK-LABEL: @sub_3(
1417f1c8fc2SCraig Topper; CHECK-NEXT:    [[TMP1:%.*]] = xor i128 [[Y:%.*]], -124
1427f1c8fc2SCraig Topper; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i128 [[X:%.*]], i128 [[TMP1]]
1437f1c8fc2SCraig Topper; CHECK-NEXT:    [[TMP3:%.*]] = add i128 [[TMP2]], [[A:%.*]]
1447f1c8fc2SCraig Topper; CHECK-NEXT:    [[NOT_AB:%.*]] = sub i128 -2, [[TMP3]]
1457f1c8fc2SCraig Topper; CHECK-NEXT:    ret i128 [[NOT_AB]]
1467f1c8fc2SCraig Topper;
1477f1c8fc2SCraig Topper  %nx = xor i128 %x, -1
1487f1c8fc2SCraig Topper  %yy = xor i128 %y, 123
1497f1c8fc2SCraig Topper  %b = select i1 %c, i128 %nx, i128 %yy
1507f1c8fc2SCraig Topper  %ab = sub i128 %a, %b
1517f1c8fc2SCraig Topper  %not_ab = xor i128 %ab, -1
1527f1c8fc2SCraig Topper  ret i128 %not_ab
1537f1c8fc2SCraig Topper}
1547f1c8fc2SCraig Topper
155742c15adSNoah Goldsteindefine i8 @sub_fail(i8 %a, i1 %c, i8 %x, i8 %y) {
156742c15adSNoah Goldstein; CHECK-LABEL: @sub_fail(
157742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
158742c15adSNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[NX]])
1593039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
1603039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[TMP1]]
1613039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = add i8 [[TMP2]], [[A:%.*]]
162742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
163742c15adSNoah Goldstein;
164742c15adSNoah Goldstein  %nx = xor i8 %x, -1
165742c15adSNoah Goldstein  %yy = xor i8 %y, 123
166742c15adSNoah Goldstein  call void @use.i8(i8 %nx)
167742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
168742c15adSNoah Goldstein  %ba = sub i8 %b, %a
169742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
170742c15adSNoah Goldstein  ret i8 %not_ba
171742c15adSNoah Goldstein}
172742c15adSNoah Goldstein
173742c15adSNoah Goldsteindefine i8 @ashr_1(i8 %a, i1 %c, i8 %x, i8 %y) {
174742c15adSNoah Goldstein; CHECK-LABEL: @ashr_1(
1753039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
1763039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
1773039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = ashr i8 [[TMP2]], [[A:%.*]]
178742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
179742c15adSNoah Goldstein;
180742c15adSNoah Goldstein  %nx = xor i8 %x, -1
181742c15adSNoah Goldstein  %yy = xor i8 %y, 123
182742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
183742c15adSNoah Goldstein  %ba = ashr i8 %b, %a
184742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
185742c15adSNoah Goldstein  ret i8 %not_ba
186742c15adSNoah Goldstein}
187742c15adSNoah Goldstein
188742c15adSNoah Goldsteindefine i8 @ashr_2_fail(i8 %a, i1 %c, i8 %x, i8 %y) {
189742c15adSNoah Goldstein; CHECK-LABEL: @ashr_2_fail(
190742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
191742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 123
192742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]]
193742c15adSNoah Goldstein; CHECK-NEXT:    [[AB:%.*]] = ashr i8 [[A:%.*]], [[B]]
194742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[AB]], -1
195742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
196742c15adSNoah Goldstein;
197742c15adSNoah Goldstein  %nx = xor i8 %x, -1
198742c15adSNoah Goldstein  %yy = xor i8 %y, 123
199742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
200742c15adSNoah Goldstein  %ab = ashr i8 %a, %b
201742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
202742c15adSNoah Goldstein  ret i8 %not_ab
203742c15adSNoah Goldstein}
204742c15adSNoah Goldstein
205742c15adSNoah Goldsteindefine i8 @select_1(i1 %cc, i8 %na, i8 %aa, i1 %c, i8 %x, i8 %y) {
206742c15adSNoah Goldstein; CHECK-LABEL: @select_1(
207742c15adSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[NA:%.*]], [[AA:%.*]]
2083039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = xor i8 [[TMP1]], -46
2093039691fSNoah Goldstein; CHECK-NEXT:    [[TMP3:%.*]] = xor i8 [[Y:%.*]], -124
2103039691fSNoah Goldstein; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP3]]
2113039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = select i1 [[CC:%.*]], i8 [[TMP2]], i8 [[TMP4]]
212742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
213742c15adSNoah Goldstein;
214742c15adSNoah Goldstein  %nx = xor i8 %x, -1
215742c15adSNoah Goldstein  %yy = xor i8 %y, 123
216742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
217742c15adSNoah Goldstein  %nna = xor i8 %na, 45
218742c15adSNoah Goldstein  %a = xor i8 %aa, %nna
219742c15adSNoah Goldstein  %ab = select i1 %cc, i8 %a, i8 %b
220742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
221742c15adSNoah Goldstein  ret i8 %not_ab
222742c15adSNoah Goldstein}
223742c15adSNoah Goldstein
224742c15adSNoah Goldsteindefine i8 @select_2(i1 %cc, i8 %na, i1 %c, i8 %x, i8 %y) {
225742c15adSNoah Goldstein; CHECK-LABEL: @select_2(
2263039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
2273039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
2283039691fSNoah Goldstein; CHECK-NEXT:    [[TMP3:%.*]] = xor i8 [[NA:%.*]], -46
2293039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = select i1 [[CC:%.*]], i8 [[TMP2]], i8 [[TMP3]]
230742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
231742c15adSNoah Goldstein;
232742c15adSNoah Goldstein  %nx = xor i8 %x, -1
233742c15adSNoah Goldstein  %yy = xor i8 %y, 123
234742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
235742c15adSNoah Goldstein  %a = xor i8 %na, 45
236742c15adSNoah Goldstein  %ba = select i1 %cc, i8 %b, i8 %a
237742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
238742c15adSNoah Goldstein  ret i8 %not_ba
239742c15adSNoah Goldstein}
240742c15adSNoah Goldstein
241742c15adSNoah Goldsteindefine i1 @select_logic_or_fail(i1 %cc, i1 %c, i1 %x, i8 %y) {
242742c15adSNoah Goldstein; CHECK-LABEL: @select_logic_or_fail(
243742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i1 [[X:%.*]], true
244742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = icmp eq i8 [[Y:%.*]], 123
245742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i1 [[NX]], i1 [[YY]]
246742c15adSNoah Goldstein; CHECK-NEXT:    [[AB:%.*]] = select i1 [[CC:%.*]], i1 [[B]], i1 false
247742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i1 [[AB]], true
248742c15adSNoah Goldstein; CHECK-NEXT:    ret i1 [[NOT_AB]]
249742c15adSNoah Goldstein;
250742c15adSNoah Goldstein  %nx = xor i1 %x, -1
251742c15adSNoah Goldstein  %yy = icmp eq i8 %y, 123
252742c15adSNoah Goldstein  %b = select i1 %c, i1 %nx, i1 %yy
253742c15adSNoah Goldstein  %ab = select i1 %cc, i1 %b, i1 false
254742c15adSNoah Goldstein  %not_ab = xor i1 %ab, -1
255742c15adSNoah Goldstein  ret i1 %not_ab
256742c15adSNoah Goldstein}
257742c15adSNoah Goldstein
258742c15adSNoah Goldsteindefine i1 @select_logic_and_fail(i1 %cc, i1 %c, i1 %x, i8 %y) {
259742c15adSNoah Goldstein; CHECK-LABEL: @select_logic_and_fail(
260742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i1 [[X:%.*]], true
261742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = icmp eq i8 [[Y:%.*]], 123
262742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i1 [[NX]], i1 [[YY]]
263742c15adSNoah Goldstein; CHECK-NEXT:    [[AB:%.*]] = select i1 [[CC:%.*]], i1 true, i1 [[B]]
264742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i1 [[AB]], true
265742c15adSNoah Goldstein; CHECK-NEXT:    ret i1 [[NOT_AB]]
266742c15adSNoah Goldstein;
267742c15adSNoah Goldstein  %nx = xor i1 %x, -1
268742c15adSNoah Goldstein  %yy = icmp eq i8 %y, 123
269742c15adSNoah Goldstein  %b = select i1 %c, i1 %nx, i1 %yy
270742c15adSNoah Goldstein  %ab = select i1 %cc, i1 true, i1 %b
271742c15adSNoah Goldstein  %not_ab = xor i1 %ab, -1
272742c15adSNoah Goldstein  ret i1 %not_ab
273742c15adSNoah Goldstein}
274742c15adSNoah Goldstein
275742c15adSNoah Goldsteindefine i8 @smin_1(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) {
276742c15adSNoah Goldstein; CHECK-LABEL: @smin_1(
2773039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 [[NA:%.*]], [[AA:%.*]]
2783039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = xor i8 [[Y:%.*]], -124
2793039691fSNoah Goldstein; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP2]]
2803039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = call i8 @llvm.smax.i8(i8 [[TMP1]], i8 [[TMP3]])
281742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
282742c15adSNoah Goldstein;
283742c15adSNoah Goldstein  %nx = xor i8 %x, -1
284742c15adSNoah Goldstein  %yy = xor i8 %y, 123
285742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
286742c15adSNoah Goldstein  %nna = xor i8 %na, -1
287742c15adSNoah Goldstein  %a = add i8 %aa, %nna
288742c15adSNoah Goldstein  %ab = call i8 @llvm.smin.i8(i8 %a, i8 %b)
289742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
290742c15adSNoah Goldstein  ret i8 %not_ab
291742c15adSNoah Goldstein}
292742c15adSNoah Goldstein
293742c15adSNoah Goldsteindefine i8 @smin_1_fail(i8 %a, i1 %c, i8 %x, i8 %y) {
294742c15adSNoah Goldstein; CHECK-LABEL: @smin_1_fail(
295742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
296742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 123
297742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]]
298742c15adSNoah Goldstein; CHECK-NEXT:    [[AB:%.*]] = call i8 @llvm.smin.i8(i8 [[A:%.*]], i8 [[B]])
299742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[AB]], -1
300742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
301742c15adSNoah Goldstein;
302742c15adSNoah Goldstein  %nx = xor i8 %x, -1
303742c15adSNoah Goldstein  %yy = xor i8 %y, 123
304742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
305742c15adSNoah Goldstein  %ab = call i8 @llvm.smin.i8(i8 %a, i8 %b)
306742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
307742c15adSNoah Goldstein  ret i8 %not_ab
308742c15adSNoah Goldstein}
309742c15adSNoah Goldstein
310742c15adSNoah Goldsteindefine i8 @umin_1_fail(i1 %c, i8 %x, i8 %y) {
311742c15adSNoah Goldstein; CHECK-LABEL: @umin_1_fail(
312742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
313742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[Y:%.*]]
314742c15adSNoah Goldstein; CHECK-NEXT:    [[BA:%.*]] = call i8 @llvm.umin.i8(i8 [[B]], i8 85)
315742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = xor i8 [[BA]], -1
316742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
317742c15adSNoah Goldstein;
318742c15adSNoah Goldstein  %nx = xor i8 %x, -1
319742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %y
320742c15adSNoah Goldstein  %ba = call i8 @llvm.umin.i8(i8 %b, i8 85)
321742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
322742c15adSNoah Goldstein  ret i8 %not_ba
323742c15adSNoah Goldstein}
324742c15adSNoah Goldstein
325742c15adSNoah Goldsteindefine i8 @smax_1(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) {
326742c15adSNoah Goldstein; CHECK-LABEL: @smax_1(
3273039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[NA:%.*]], [[AA:%.*]]
3283039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = xor i8 [[Y:%.*]], -124
3293039691fSNoah Goldstein; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP2]]
3303039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = call i8 @llvm.smin.i8(i8 [[TMP1]], i8 [[TMP3]])
331742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
332742c15adSNoah Goldstein;
333742c15adSNoah Goldstein  %nx = xor i8 %x, -1
334742c15adSNoah Goldstein  %yy = xor i8 %y, 123
335742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
336742c15adSNoah Goldstein  %nna = xor i8 %na, -1
337742c15adSNoah Goldstein  %a = sub i8 %nna, %aa
338742c15adSNoah Goldstein  %ab = call i8 @llvm.smax.i8(i8 %a, i8 %b)
339742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
340742c15adSNoah Goldstein  ret i8 %not_ab
341742c15adSNoah Goldstein}
342742c15adSNoah Goldstein
343742c15adSNoah Goldsteindefine i8 @smax_1_fail(i8 %aa, i8 %na, i1 %c, i8 %x, i8 %y) {
344742c15adSNoah Goldstein; CHECK-LABEL: @smax_1_fail(
345742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
346742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 123
347742c15adSNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[YY]])
348742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]]
349742c15adSNoah Goldstein; CHECK-NEXT:    [[NNA:%.*]] = xor i8 [[NA:%.*]], -1
350742c15adSNoah Goldstein; CHECK-NEXT:    [[A:%.*]] = sub i8 [[NNA]], [[AA:%.*]]
351742c15adSNoah Goldstein; CHECK-NEXT:    [[AB:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 [[B]])
352742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_AB:%.*]] = xor i8 [[AB]], -1
353742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_AB]]
354742c15adSNoah Goldstein;
355742c15adSNoah Goldstein  %nx = xor i8 %x, -1
356742c15adSNoah Goldstein  %yy = xor i8 %y, 123
357742c15adSNoah Goldstein  call void @use.i8(i8 %yy)
358742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
359742c15adSNoah Goldstein  %nna = xor i8 %na, -1
360742c15adSNoah Goldstein  %a = sub i8 %nna, %aa
361742c15adSNoah Goldstein  %ab = call i8 @llvm.smax.i8(i8 %a, i8 %b)
362742c15adSNoah Goldstein  %not_ab = xor i8 %ab, -1
363742c15adSNoah Goldstein  ret i8 %not_ab
364742c15adSNoah Goldstein}
365742c15adSNoah Goldstein
366742c15adSNoah Goldsteindefine i8 @umax_1(i8 %na, i1 %c, i8 %x, i8 %y) {
367742c15adSNoah Goldstein; CHECK-LABEL: @umax_1(
3683039691fSNoah Goldstein; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], -124
3693039691fSNoah Goldstein; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[C:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
3703039691fSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = call i8 @llvm.umin.i8(i8 [[TMP2]], i8 -86)
371742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
372742c15adSNoah Goldstein;
373742c15adSNoah Goldstein  %nx = xor i8 %x, -1
374742c15adSNoah Goldstein  %yy = xor i8 %y, 123
375742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
376742c15adSNoah Goldstein  %ba = call i8 @llvm.umax.i8(i8 %b, i8 85)
377742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
378742c15adSNoah Goldstein  ret i8 %not_ba
379742c15adSNoah Goldstein}
380742c15adSNoah Goldstein
381742c15adSNoah Goldsteindefine i8 @umax_1_fail(i8 %na, i1 %c, i8 %x, i8 %y) {
382742c15adSNoah Goldstein; CHECK-LABEL: @umax_1_fail(
383742c15adSNoah Goldstein; CHECK-NEXT:    [[NX:%.*]] = xor i8 [[X:%.*]], -1
384742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 123
385742c15adSNoah Goldstein; CHECK-NEXT:    [[B:%.*]] = select i1 [[C:%.*]], i8 [[NX]], i8 [[YY]]
386742c15adSNoah Goldstein; CHECK-NEXT:    call void @use.i8(i8 [[B]])
387742c15adSNoah Goldstein; CHECK-NEXT:    [[BA:%.*]] = call i8 @llvm.umax.i8(i8 [[B]], i8 85)
388742c15adSNoah Goldstein; CHECK-NEXT:    [[NOT_BA:%.*]] = xor i8 [[BA]], -1
389742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[NOT_BA]]
390742c15adSNoah Goldstein;
391742c15adSNoah Goldstein  %nx = xor i8 %x, -1
392742c15adSNoah Goldstein  %yy = xor i8 %y, 123
393742c15adSNoah Goldstein  %b = select i1 %c, i8 %nx, i8 %yy
394742c15adSNoah Goldstein  call void @use.i8(i8 %b)
395742c15adSNoah Goldstein  %ba = call i8 @llvm.umax.i8(i8 %b, i8 85)
396742c15adSNoah Goldstein  %not_ba = xor i8 %ba, -1
397742c15adSNoah Goldstein  ret i8 %not_ba
398742c15adSNoah Goldstein}
399742c15adSNoah Goldstein
400742c15adSNoah Goldsteindefine i8 @sub_both_freely_invertable_always(i8 %x, i8 %y) {
401742c15adSNoah Goldstein; CHECK-LABEL: @sub_both_freely_invertable_always(
402742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
403742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
404742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = sub i8 [[XX]], [[YY]]
405742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
406742c15adSNoah Goldstein;
407742c15adSNoah Goldstein  %xx = xor i8 %x, 123
408742c15adSNoah Goldstein  %yy = xor i8 %y, 45
409742c15adSNoah Goldstein  %r = sub i8 %xx, %yy
410742c15adSNoah Goldstein  ret i8 %r
411742c15adSNoah Goldstein}
412742c15adSNoah Goldstein
413742c15adSNoah Goldsteindefine i8 @add_both_freely_invertable_always(i8 %x, i8 %y) {
414742c15adSNoah Goldstein; CHECK-LABEL: @add_both_freely_invertable_always(
415742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
416742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
417742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = add i8 [[XX]], [[YY]]
418742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
419742c15adSNoah Goldstein;
420742c15adSNoah Goldstein  %xx = xor i8 %x, 123
421742c15adSNoah Goldstein  %yy = xor i8 %y, 45
422742c15adSNoah Goldstein  %r = add i8 %xx, %yy
423742c15adSNoah Goldstein  ret i8 %r
424742c15adSNoah Goldstein}
425742c15adSNoah Goldstein
426742c15adSNoah Goldsteindefine i8 @xor_both_freely_invertable_always(i8 %x, i8 %y) {
427742c15adSNoah Goldstein; CHECK-LABEL: @xor_both_freely_invertable_always(
428742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = add i8 [[X:%.*]], 123
429742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = add i8 [[Y:%.*]], 45
430742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = xor i8 [[XX]], [[YY]]
431742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
432742c15adSNoah Goldstein;
433742c15adSNoah Goldstein  %xx = add i8 %x, 123
434742c15adSNoah Goldstein  %yy = add i8 %y, 45
435742c15adSNoah Goldstein  %r = xor i8 %xx, %yy
436742c15adSNoah Goldstein  ret i8 %r
437742c15adSNoah Goldstein}
438742c15adSNoah Goldstein
439742c15adSNoah Goldsteindefine i8 @ashr_both_freely_invertable_always(i8 %x, i8 %y) {
440742c15adSNoah Goldstein; CHECK-LABEL: @ashr_both_freely_invertable_always(
441742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
442742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
443742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = ashr i8 [[XX]], [[YY]]
444742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
445742c15adSNoah Goldstein;
446742c15adSNoah Goldstein  %xx = xor i8 %x, 123
447742c15adSNoah Goldstein  %yy = xor i8 %y, 45
448742c15adSNoah Goldstein  %r = ashr i8 %xx, %yy
449742c15adSNoah Goldstein  ret i8 %r
450742c15adSNoah Goldstein}
451742c15adSNoah Goldstein
452742c15adSNoah Goldsteindefine i8 @select_both_freely_invertable_always(i1 %cc, i8 %x, i8 %y) {
453742c15adSNoah Goldstein; CHECK-LABEL: @select_both_freely_invertable_always(
454742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
455742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
456742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = select i1 [[CC:%.*]], i8 [[XX]], i8 [[YY]]
457742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
458742c15adSNoah Goldstein;
459742c15adSNoah Goldstein  %xx = xor i8 %x, 123
460742c15adSNoah Goldstein  %yy = xor i8 %y, 45
461742c15adSNoah Goldstein  %r = select i1 %cc, i8 %xx, i8 %yy
462742c15adSNoah Goldstein  ret i8 %r
463742c15adSNoah Goldstein}
464742c15adSNoah Goldstein
465742c15adSNoah Goldsteindefine i8 @umin_both_freely_invertable_always(i8 %x, i8 %y) {
466742c15adSNoah Goldstein; CHECK-LABEL: @umin_both_freely_invertable_always(
467742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
468742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
469742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.umin.i8(i8 [[XX]], i8 [[YY]])
470742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
471742c15adSNoah Goldstein;
472742c15adSNoah Goldstein  %xx = xor i8 %x, 123
473742c15adSNoah Goldstein  %yy = xor i8 %y, 45
474742c15adSNoah Goldstein  %r = call i8 @llvm.umin.i8(i8 %xx, i8 %yy)
475742c15adSNoah Goldstein  ret i8 %r
476742c15adSNoah Goldstein}
477742c15adSNoah Goldstein
478742c15adSNoah Goldsteindefine i8 @umax_both_freely_invertable_always(i8 %x, i8 %y) {
479742c15adSNoah Goldstein; CHECK-LABEL: @umax_both_freely_invertable_always(
480742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
481742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
482742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.umax.i8(i8 [[XX]], i8 [[YY]])
483742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
484742c15adSNoah Goldstein;
485742c15adSNoah Goldstein  %xx = xor i8 %x, 123
486742c15adSNoah Goldstein  %yy = xor i8 %y, 45
487742c15adSNoah Goldstein  %r = call i8 @llvm.umax.i8(i8 %xx, i8 %yy)
488742c15adSNoah Goldstein  ret i8 %r
489742c15adSNoah Goldstein}
490742c15adSNoah Goldstein
491742c15adSNoah Goldsteindefine i8 @smin_both_freely_invertable_always(i8 %x, i8 %y) {
492742c15adSNoah Goldstein; CHECK-LABEL: @smin_both_freely_invertable_always(
493742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
494742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
495742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.smin.i8(i8 [[XX]], i8 [[YY]])
496742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
497742c15adSNoah Goldstein;
498742c15adSNoah Goldstein  %xx = xor i8 %x, 123
499742c15adSNoah Goldstein  %yy = xor i8 %y, 45
500742c15adSNoah Goldstein  %r = call i8 @llvm.smin.i8(i8 %xx, i8 %yy)
501742c15adSNoah Goldstein  ret i8 %r
502742c15adSNoah Goldstein}
503742c15adSNoah Goldstein
504742c15adSNoah Goldsteindefine i8 @smax_both_freely_invertable_always(i8 %x, i8 %y) {
505742c15adSNoah Goldstein; CHECK-LABEL: @smax_both_freely_invertable_always(
506742c15adSNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = xor i8 [[X:%.*]], 123
507742c15adSNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = xor i8 [[Y:%.*]], 45
508742c15adSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[XX]], i8 [[YY]])
509742c15adSNoah Goldstein; CHECK-NEXT:    ret i8 [[R]]
510742c15adSNoah Goldstein;
511742c15adSNoah Goldstein  %xx = xor i8 %x, 123
512742c15adSNoah Goldstein  %yy = xor i8 %y, 45
513742c15adSNoah Goldstein  %r = call i8 @llvm.smax.i8(i8 %xx, i8 %yy)
514742c15adSNoah Goldstein  ret i8 %r
515742c15adSNoah Goldstein}
516dd5c5349SNikita Popov
517dd5c5349SNikita Popovdefine i8 @lshr_nneg(i8 %x, i8 %y) {
518dd5c5349SNikita Popov; CHECK-LABEL: @lshr_nneg(
519dd5c5349SNikita Popov; CHECK-NEXT:    [[NEG:%.*]] = icmp slt i8 [[X:%.*]], 0
520dd5c5349SNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[NEG]])
521faebb1b2SNikita Popov; CHECK-NEXT:    [[SHR_NOT:%.*]] = ashr i8 [[X]], [[Y:%.*]]
522dd5c5349SNikita Popov; CHECK-NEXT:    ret i8 [[SHR_NOT]]
523dd5c5349SNikita Popov;
524dd5c5349SNikita Popov  %neg = icmp slt i8 %x, 0
525dd5c5349SNikita Popov  call void @llvm.assume(i1 %neg)
526dd5c5349SNikita Popov  %x.not = xor i8 %x, -1
527dd5c5349SNikita Popov  %shr = lshr i8 %x.not, %y
528dd5c5349SNikita Popov  %shr.not = xor i8 %shr, -1
529dd5c5349SNikita Popov  ret i8 %shr.not
530dd5c5349SNikita Popov}
531dd5c5349SNikita Popov
532dd5c5349SNikita Popovdefine i8 @lshr_not_nneg(i8 %x, i8 %y) {
533dd5c5349SNikita Popov; CHECK-LABEL: @lshr_not_nneg(
534dd5c5349SNikita Popov; CHECK-NEXT:    [[X_NOT:%.*]] = xor i8 [[X:%.*]], -1
535dd5c5349SNikita Popov; CHECK-NEXT:    [[SHR:%.*]] = lshr i8 [[X_NOT]], [[Y:%.*]]
536dd5c5349SNikita Popov; CHECK-NEXT:    [[SHR_NOT:%.*]] = xor i8 [[SHR]], -1
537dd5c5349SNikita Popov; CHECK-NEXT:    ret i8 [[SHR_NOT]]
538dd5c5349SNikita Popov;
539dd5c5349SNikita Popov  %x.not = xor i8 %x, -1
540dd5c5349SNikita Popov  %shr = lshr i8 %x.not, %y
541dd5c5349SNikita Popov  %shr.not = xor i8 %shr, -1
542dd5c5349SNikita Popov  ret i8 %shr.not
543dd5c5349SNikita Popov}
5447007919cSNikita Popov
5457007919cSNikita Popovdefine i8 @lshr_not_nneg2(i8 %x) {
5467007919cSNikita Popov; CHECK-LABEL: @lshr_not_nneg2(
5477007919cSNikita Popov; CHECK-NEXT:    [[SHR:%.*]] = lshr i8 [[X:%.*]], 1
5487ab0a871SYingwei Zheng; CHECK-NEXT:    [[SHR_NOT:%.*]] = or disjoint i8 [[SHR]], -128
5497ab0a871SYingwei Zheng; CHECK-NEXT:    ret i8 [[SHR_NOT]]
5507007919cSNikita Popov;
5517007919cSNikita Popov  %x.not = xor i8 %x, -1
5527007919cSNikita Popov  %shr = lshr i8 %x.not, 1
5537007919cSNikita Popov  %shr.not = xor i8 %shr, -1
5547007919cSNikita Popov  ret i8 %shr.not
5557007919cSNikita Popov}
5567ab0a871SYingwei Zheng
5577ab0a871SYingwei Zhengdefine i1 @test_inv_free(i1 %c1, i1 %c2, i1 %c3, i1 %c4) {
5587ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free(
5597ab0a871SYingwei Zheng; CHECK-NEXT:  entry:
5607ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]]
5617ab0a871SYingwei Zheng; CHECK:       b1:
5627ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]]
5637ab0a871SYingwei Zheng; CHECK:       b2:
5647ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
5657ab0a871SYingwei Zheng; CHECK:       b3:
5667ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
5677ab0a871SYingwei Zheng; CHECK:       exit:
5687ab0a871SYingwei Zheng; CHECK-NEXT:    [[VAL_NOT:%.*]] = phi i1 [ false, [[B1]] ], [ true, [[B2]] ], [ [[C3:%.*]], [[B3]] ]
5697ab0a871SYingwei Zheng; CHECK-NEXT:    [[COND_NOT:%.*]] = and i1 [[VAL_NOT]], [[C4:%.*]]
5707ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[COND_NOT]], label [[B5:%.*]], label [[B4:%.*]]
5717ab0a871SYingwei Zheng; CHECK:       b4:
5727ab0a871SYingwei Zheng; CHECK-NEXT:    ret i1 true
5737ab0a871SYingwei Zheng; CHECK:       b5:
5747ab0a871SYingwei Zheng; CHECK-NEXT:    ret i1 false
5757ab0a871SYingwei Zheng;
5767ab0a871SYingwei Zhengentry:
5777ab0a871SYingwei Zheng  br i1 %c1, label %b1, label %b2
5787ab0a871SYingwei Zhengb1:
5797ab0a871SYingwei Zheng  br i1 %c2, label %exit, label %b3
5807ab0a871SYingwei Zhengb2:
5817ab0a871SYingwei Zheng  br label %exit
5827ab0a871SYingwei Zhengb3:
5837ab0a871SYingwei Zheng  %invc3 = xor i1 %c3, true
5847ab0a871SYingwei Zheng  br label %exit
5857ab0a871SYingwei Zhengexit:
5867ab0a871SYingwei Zheng  %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ]
5877ab0a871SYingwei Zheng  %inv = xor i1 %c4, true
5887ab0a871SYingwei Zheng  %cond = or i1 %val, %inv
5897ab0a871SYingwei Zheng  br i1 %cond, label %b4, label %b5
5907ab0a871SYingwei Zhengb4:
5917ab0a871SYingwei Zheng  ret i1 true
5927ab0a871SYingwei Zhengb5:
5937ab0a871SYingwei Zheng  ret i1 false
5947ab0a871SYingwei Zheng}
5957ab0a871SYingwei Zheng
5967ab0a871SYingwei Zhengdefine i32 @test_inv_free_i32(i1 %c1, i1 %c2, i32 %c3, i32 %c4) {
5977ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_i32(
5987ab0a871SYingwei Zheng; CHECK-NEXT:  entry:
5997ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]]
6007ab0a871SYingwei Zheng; CHECK:       b1:
6017ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]]
6027ab0a871SYingwei Zheng; CHECK:       b2:
6037ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6047ab0a871SYingwei Zheng; CHECK:       b3:
6057ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6067ab0a871SYingwei Zheng; CHECK:       exit:
6077ab0a871SYingwei Zheng; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ 0, [[B1]] ], [ -1, [[B2]] ], [ [[C3:%.*]], [[B3]] ]
608*a1058776SNikita Popov; CHECK-NEXT:    [[COND:%.*]] = xor i32 [[C4:%.*]], [[TMP0]]
6097ab0a871SYingwei Zheng; CHECK-NEXT:    ret i32 [[COND]]
6107ab0a871SYingwei Zheng;
6117ab0a871SYingwei Zhengentry:
6127ab0a871SYingwei Zheng  br i1 %c1, label %b1, label %b2
6137ab0a871SYingwei Zhengb1:
6147ab0a871SYingwei Zheng  br i1 %c2, label %exit, label %b3
6157ab0a871SYingwei Zhengb2:
6167ab0a871SYingwei Zheng  br label %exit
6177ab0a871SYingwei Zhengb3:
6187ab0a871SYingwei Zheng  %invc3 = xor i32 %c3, -1
6197ab0a871SYingwei Zheng  br label %exit
6207ab0a871SYingwei Zhengexit:
6217ab0a871SYingwei Zheng  %val = phi i32 [ -1, %b1 ], [ 0, %b2 ], [ %invc3, %b3 ]
6227ab0a871SYingwei Zheng  %inv = xor i32 %c4, -1
6237ab0a871SYingwei Zheng  %cond = xor i32 %val, %inv
6247ab0a871SYingwei Zheng  ret i32 %cond
6257ab0a871SYingwei Zheng}
6267ab0a871SYingwei Zheng
6277ab0a871SYingwei Zheng; Negative tests
6287ab0a871SYingwei Zheng
6297ab0a871SYingwei Zhengdefine i1 @test_inv_free_multiuse(i1 %c1, i1 %c2, i1 %c3, i1 %c4) {
6307ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_multiuse(
6317ab0a871SYingwei Zheng; CHECK-NEXT:  entry:
6327ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]]
6337ab0a871SYingwei Zheng; CHECK:       b1:
6347ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]]
6357ab0a871SYingwei Zheng; CHECK:       b2:
6367ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6377ab0a871SYingwei Zheng; CHECK:       b3:
6387ab0a871SYingwei Zheng; CHECK-NEXT:    [[INVC3:%.*]] = xor i1 [[C3:%.*]], true
6397ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6407ab0a871SYingwei Zheng; CHECK:       exit:
6417ab0a871SYingwei Zheng; CHECK-NEXT:    [[VAL:%.*]] = phi i1 [ true, [[B1]] ], [ false, [[B2]] ], [ [[INVC3]], [[B3]] ]
6427ab0a871SYingwei Zheng; CHECK-NEXT:    call void @use.i1(i1 [[VAL]])
6437ab0a871SYingwei Zheng; CHECK-NEXT:    [[INV:%.*]] = xor i1 [[C4:%.*]], true
6447ab0a871SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = or i1 [[VAL]], [[INV]]
6457ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[B4:%.*]], label [[B5:%.*]]
6467ab0a871SYingwei Zheng; CHECK:       b4:
6477ab0a871SYingwei Zheng; CHECK-NEXT:    ret i1 true
6487ab0a871SYingwei Zheng; CHECK:       b5:
6497ab0a871SYingwei Zheng; CHECK-NEXT:    ret i1 false
6507ab0a871SYingwei Zheng;
6517ab0a871SYingwei Zhengentry:
6527ab0a871SYingwei Zheng  br i1 %c1, label %b1, label %b2
6537ab0a871SYingwei Zhengb1:
6547ab0a871SYingwei Zheng  br i1 %c2, label %exit, label %b3
6557ab0a871SYingwei Zhengb2:
6567ab0a871SYingwei Zheng  br label %exit
6577ab0a871SYingwei Zhengb3:
6587ab0a871SYingwei Zheng  %invc3 = xor i1 %c3, true
6597ab0a871SYingwei Zheng  br label %exit
6607ab0a871SYingwei Zhengexit:
6617ab0a871SYingwei Zheng  %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ]
6627ab0a871SYingwei Zheng  call void @use.i1(i1 %val)
6637ab0a871SYingwei Zheng  %inv = xor i1 %c4, true
6647ab0a871SYingwei Zheng  %cond = or i1 %val, %inv
6657ab0a871SYingwei Zheng  br i1 %cond, label %b4, label %b5
6667ab0a871SYingwei Zhengb4:
6677ab0a871SYingwei Zheng  ret i1 true
6687ab0a871SYingwei Zhengb5:
6697ab0a871SYingwei Zheng  ret i1 false
6707ab0a871SYingwei Zheng}
6717ab0a871SYingwei Zheng
6727ab0a871SYingwei Zhengdefine i32 @test_inv_free_i32_newinst(i1 %c1, i1 %c2, i32 %c3, i32 %c4) {
6737ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_i32_newinst(
6747ab0a871SYingwei Zheng; CHECK-NEXT:  entry:
6757ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]]
6767ab0a871SYingwei Zheng; CHECK:       b1:
6777ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]]
6787ab0a871SYingwei Zheng; CHECK:       b2:
6797ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6807ab0a871SYingwei Zheng; CHECK:       b3:
6817ab0a871SYingwei Zheng; CHECK-NEXT:    [[ASHR:%.*]] = ashr i32 -8, [[C3:%.*]]
6827ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
6837ab0a871SYingwei Zheng; CHECK:       exit:
6847ab0a871SYingwei Zheng; CHECK-NEXT:    [[VAL:%.*]] = phi i32 [ -1, [[B1]] ], [ 0, [[B2]] ], [ [[ASHR]], [[B3]] ]
685*a1058776SNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = xor i32 [[C4:%.*]], [[VAL]]
6867ab0a871SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = xor i32 [[TMP0]], -1
6877ab0a871SYingwei Zheng; CHECK-NEXT:    ret i32 [[COND]]
6887ab0a871SYingwei Zheng;
6897ab0a871SYingwei Zhengentry:
6907ab0a871SYingwei Zheng  br i1 %c1, label %b1, label %b2
6917ab0a871SYingwei Zhengb1:
6927ab0a871SYingwei Zheng  br i1 %c2, label %exit, label %b3
6937ab0a871SYingwei Zhengb2:
6947ab0a871SYingwei Zheng  br label %exit
6957ab0a871SYingwei Zhengb3:
6967ab0a871SYingwei Zheng  %ashr = ashr i32 -8, %c3
6977ab0a871SYingwei Zheng  br label %exit
6987ab0a871SYingwei Zhengexit:
6997ab0a871SYingwei Zheng  %val = phi i32 [ -1, %b1 ], [ 0, %b2 ], [ %ashr, %b3 ]
7007ab0a871SYingwei Zheng  %inv = xor i32 %c4, -1
7017ab0a871SYingwei Zheng  %cond = xor i32 %val, %inv
7027ab0a871SYingwei Zheng  ret i32 %cond
7037ab0a871SYingwei Zheng}
7047ab0a871SYingwei Zheng
7057ab0a871SYingwei Zhengdefine i1 @test_inv_free_loop(i1 %c1, i1 %c2, i1 %c3, i1 %c4) {
7067ab0a871SYingwei Zheng; CHECK-LABEL: @test_inv_free_loop(
7077ab0a871SYingwei Zheng; CHECK-NEXT:  entry:
7087ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C1:%.*]], label [[B1:%.*]], label [[B2:%.*]]
7097ab0a871SYingwei Zheng; CHECK:       b1:
7107ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[C2:%.*]], label [[EXIT:%.*]], label [[B3:%.*]]
7117ab0a871SYingwei Zheng; CHECK:       b2:
7127ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
7137ab0a871SYingwei Zheng; CHECK:       b3:
7147ab0a871SYingwei Zheng; CHECK-NEXT:    [[INVC3:%.*]] = xor i1 [[C3:%.*]], true
7157ab0a871SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
7167ab0a871SYingwei Zheng; CHECK:       exit:
7177ab0a871SYingwei Zheng; CHECK-NEXT:    [[VAL:%.*]] = phi i1 [ true, [[B1]] ], [ false, [[B2]] ], [ [[INVC3]], [[B3]] ], [ [[NOT:%.*]], [[EXIT]] ]
7187ab0a871SYingwei Zheng; CHECK-NEXT:    [[INV:%.*]] = xor i1 [[C4:%.*]], true
7197ab0a871SYingwei Zheng; CHECK-NEXT:    [[COND:%.*]] = or i1 [[VAL]], [[INV]]
7207ab0a871SYingwei Zheng; CHECK-NEXT:    [[NOT]] = xor i1 [[VAL]], true
7217ab0a871SYingwei Zheng; CHECK-NEXT:    br i1 [[COND]], label [[EXIT]], label [[B4:%.*]]
7227ab0a871SYingwei Zheng; CHECK:       b4:
7237ab0a871SYingwei Zheng; CHECK-NEXT:    ret i1 true
7247ab0a871SYingwei Zheng;
7257ab0a871SYingwei Zhengentry:
7267ab0a871SYingwei Zheng  br i1 %c1, label %b1, label %b2
7277ab0a871SYingwei Zhengb1:
7287ab0a871SYingwei Zheng  br i1 %c2, label %exit, label %b3
7297ab0a871SYingwei Zhengb2:
7307ab0a871SYingwei Zheng  br label %exit
7317ab0a871SYingwei Zhengb3:
7327ab0a871SYingwei Zheng  %invc3 = xor i1 %c3, true
7337ab0a871SYingwei Zheng  br label %exit
7347ab0a871SYingwei Zhengexit:
7357ab0a871SYingwei Zheng  %val = phi i1 [ true, %b1 ], [ false, %b2 ], [ %invc3, %b3 ], [ %not, %exit ]
7367ab0a871SYingwei Zheng  %inv = xor i1 %c4, true
7377ab0a871SYingwei Zheng  %cond = or i1 %val, %inv
7387ab0a871SYingwei Zheng  %not = xor i1 %val, true
7397ab0a871SYingwei Zheng  br i1 %cond, label %exit, label %b4
7407ab0a871SYingwei Zhengb4:
7417ab0a871SYingwei Zheng  ret i1 true
7427ab0a871SYingwei Zheng}
743