xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/transfer-unsigned-facts-to-signed.ll (revision 98e016d99732dc8fef8cfd61d6ce1edd042309a1)
1c259a2b9SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
227d1d8bcSRoman Lebedev; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3c259a2b9SFlorian Hahn
4c259a2b9SFlorian Hahndefine i1 @idx_known_positive_via_len_1(i8 %len, i8 %idx) {
5c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_known_positive_via_len_1(
6c259a2b9SFlorian Hahn; CHECK-NEXT:  entry:
7c259a2b9SFlorian Hahn; CHECK-NEXT:    [[LEN_POS:%.*]] = icmp sge i8 [[LEN:%.*]], 0
8c259a2b9SFlorian Hahn; CHECK-NEXT:    [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]]
9c259a2b9SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[LEN_POS]], [[IDX_ULT_LEN]]
10c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]
11c259a2b9SFlorian Hahn; CHECK:       then.1:
1292f87787SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
13c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[IDX]], 1
14c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
1592f87787SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
16c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
17c259a2b9SFlorian Hahn; CHECK:       else:
18c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i8 [[IDX]], 0
19c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_3]]
20c259a2b9SFlorian Hahn;
21c259a2b9SFlorian Hahnentry:
22c259a2b9SFlorian Hahn  %len.pos = icmp sge i8 %len, 0
23c259a2b9SFlorian Hahn  %idx.ult.len  = icmp ult i8 %idx, %len
24c259a2b9SFlorian Hahn  %and.1 = and i1 %len.pos, %idx.ult.len
25c259a2b9SFlorian Hahn  br i1 %and.1, label %then.1, label %else
26c259a2b9SFlorian Hahn
27c259a2b9SFlorian Hahnthen.1:
28c259a2b9SFlorian Hahn  %t.1 = icmp ult i8 %idx, %len
29c259a2b9SFlorian Hahn  %t.2 = icmp sge i8 %idx, 0
30c259a2b9SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
31c259a2b9SFlorian Hahn
32c259a2b9SFlorian Hahn  %c.1 = icmp sge i8 %idx, 1
33c259a2b9SFlorian Hahn  %r.2 = xor i1 %r.1, %c.1
34c259a2b9SFlorian Hahn
35c259a2b9SFlorian Hahn  %c.2 = icmp sge i8 %len, 1
36c259a2b9SFlorian Hahn  %r.3 = xor i1 %r.2, %c.2
37c259a2b9SFlorian Hahn  ret i1 %r.3
38c259a2b9SFlorian Hahn
39c259a2b9SFlorian Hahnelse:
40c259a2b9SFlorian Hahn  %c.3 = icmp sge i8 %idx, 0
41c259a2b9SFlorian Hahn  ret i1 %c.3
42c259a2b9SFlorian Hahn}
43c259a2b9SFlorian Hahn
44c259a2b9SFlorian Hahn; Like @idx_known_positive_via_len_1, but with a different order of known facts.
45c259a2b9SFlorian Hahndefine i1 @idx_known_positive_via_len_2(i8 %len, i8 %idx) {
46c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_known_positive_via_len_2(
47c259a2b9SFlorian Hahn; CHECK-NEXT:  entry:
48c259a2b9SFlorian Hahn; CHECK-NEXT:    [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]]
49c259a2b9SFlorian Hahn; CHECK-NEXT:    [[LEN_POS:%.*]] = icmp sge i8 [[LEN]], 0
50c259a2b9SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[IDX_ULT_LEN]], [[LEN_POS]]
51c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]
52c259a2b9SFlorian Hahn; CHECK:       then.1:
538e3e9629SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
54c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[IDX]], 1
55c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
568e3e9629SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
57c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
58c259a2b9SFlorian Hahn; CHECK:       else:
59c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i8 [[IDX]], 0
60c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_3]]
61c259a2b9SFlorian Hahn;
62c259a2b9SFlorian Hahnentry:
63c259a2b9SFlorian Hahn  %idx.ult.len  = icmp ult i8 %idx, %len
64c259a2b9SFlorian Hahn  %len.pos = icmp sge i8 %len, 0
65c259a2b9SFlorian Hahn  %and.1 = and i1 %idx.ult.len, %len.pos
66c259a2b9SFlorian Hahn  br i1 %and.1, label %then.1, label %else
67c259a2b9SFlorian Hahn
68c259a2b9SFlorian Hahnthen.1:
69c259a2b9SFlorian Hahn  %t.1 = icmp ult i8 %idx, %len
70c259a2b9SFlorian Hahn  %t.2 = icmp sge i8 %idx, 0
71c259a2b9SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
72c259a2b9SFlorian Hahn
73c259a2b9SFlorian Hahn  %c.1 = icmp sge i8 %idx, 1
74c259a2b9SFlorian Hahn  %r.2 = xor i1 %r.1, %c.1
75c259a2b9SFlorian Hahn
76c259a2b9SFlorian Hahn  %c.2 = icmp sge i8 %len, 1
77c259a2b9SFlorian Hahn  %r.3 = xor i1 %r.2, %c.2
78c259a2b9SFlorian Hahn  ret i1 %r.3
79c259a2b9SFlorian Hahn
80c259a2b9SFlorian Hahnelse:
81c259a2b9SFlorian Hahn  %c.3 = icmp sge i8 %idx, 0
82c259a2b9SFlorian Hahn  ret i1 %c.3
83c259a2b9SFlorian Hahn}
84c259a2b9SFlorian Hahn
85c259a2b9SFlorian Hahn
86c259a2b9SFlorian Hahn; %len >=u 0 is not enough to determine idx >=s 0.
87c259a2b9SFlorian Hahndefine i1 @idx_not_known_positive_via_len_uge(i8 %len, i8 %idx) {
88c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_not_known_positive_via_len_uge(
89c259a2b9SFlorian Hahn; CHECK-NEXT:  entry:
90*98e016d9SFlorian Hahn; CHECK-NEXT:    [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]]
91*98e016d9SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 true, [[IDX_ULT_LEN]]
92c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]
93c259a2b9SFlorian Hahn; CHECK:       then.1:
94c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[IDX]], 0
95c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, [[C_2]]
96c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i8 [[IDX]], 1
97c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
98c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i8 [[LEN]], 1
99c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
100c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
101c259a2b9SFlorian Hahn; CHECK:       else:
102c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i8 [[IDX]], 0
103c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_5]]
104c259a2b9SFlorian Hahn;
105c259a2b9SFlorian Hahnentry:
106c259a2b9SFlorian Hahn  %len.pos = icmp uge i8 %len, 0
107c259a2b9SFlorian Hahn  %idx.ult.len  = icmp ult i8 %idx, %len
108c259a2b9SFlorian Hahn  %and.1 = and i1 %len.pos, %idx.ult.len
109c259a2b9SFlorian Hahn  br i1 %and.1, label %then.1, label %else
110c259a2b9SFlorian Hahn
111c259a2b9SFlorian Hahnthen.1:
112c259a2b9SFlorian Hahn  %c.1 = icmp ult i8 %idx, %len
113c259a2b9SFlorian Hahn  %c.2 = icmp sge i8 %idx, 0
114c259a2b9SFlorian Hahn  %r.1 = xor i1 %c.1, %c.2
115c259a2b9SFlorian Hahn
116c259a2b9SFlorian Hahn  %c.3 = icmp sge i8 %idx, 1
117c259a2b9SFlorian Hahn  %r.2 = xor i1 %r.1, %c.3
118c259a2b9SFlorian Hahn
119c259a2b9SFlorian Hahn  %c.4 = icmp sge i8 %len, 1
120c259a2b9SFlorian Hahn  %r.3 = xor i1 %r.2, %c.4
121c259a2b9SFlorian Hahn  ret i1 %r.3
122c259a2b9SFlorian Hahn
123c259a2b9SFlorian Hahnelse:
124c259a2b9SFlorian Hahn  %c.5 = icmp sge i8 %idx, 0
125c259a2b9SFlorian Hahn  ret i1 %c.5
126c259a2b9SFlorian Hahn}
127c259a2b9SFlorian Hahn
128c259a2b9SFlorian Hahn; There's no information about %len which could be used to determine %len >=s 0.
129c259a2b9SFlorian Hahndefine i1 @idx_not_known_positive_via_len(i8 %len, i8 %idx) {
130c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_not_known_positive_via_len(
131c259a2b9SFlorian Hahn; CHECK-NEXT:  entry:
132c259a2b9SFlorian Hahn; CHECK-NEXT:    [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]]
133c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[IDX_ULT_LEN]], label [[THEN_1:%.*]], label [[ELSE:%.*]]
134c259a2b9SFlorian Hahn; CHECK:       then.1:
135c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[IDX]], 0
136c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, [[C_2]]
137c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i8 [[IDX]], 1
138c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
139c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i8 [[LEN]], 1
140c259a2b9SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
141c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
142c259a2b9SFlorian Hahn; CHECK:       else:
143c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge i8 [[IDX]], 0
144c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_5]]
145c259a2b9SFlorian Hahn;
146c259a2b9SFlorian Hahnentry:
147c259a2b9SFlorian Hahn  %idx.ult.len  = icmp ult i8 %idx, %len
148c259a2b9SFlorian Hahn  br i1 %idx.ult.len, label %then.1, label %else
149c259a2b9SFlorian Hahn
150c259a2b9SFlorian Hahnthen.1:
151c259a2b9SFlorian Hahn  %c.1 = icmp ult i8 %idx, %len
152c259a2b9SFlorian Hahn  %c.2 = icmp sge i8 %idx, 0
153c259a2b9SFlorian Hahn  %r.1 = xor i1 %c.1, %c.2
154c259a2b9SFlorian Hahn
155c259a2b9SFlorian Hahn  %c.3 = icmp sge i8 %idx, 1
156c259a2b9SFlorian Hahn  %r.2 = xor i1 %r.1, %c.3
157c259a2b9SFlorian Hahn
158c259a2b9SFlorian Hahn  %c.4 = icmp sge i8 %len, 1
159c259a2b9SFlorian Hahn  %r.3 = xor i1 %r.2, %c.4
160c259a2b9SFlorian Hahn  ret i1 %r.3
161c259a2b9SFlorian Hahn
162c259a2b9SFlorian Hahnelse:
163c259a2b9SFlorian Hahn  %c.5 = icmp sge i8 %idx, 0
164c259a2b9SFlorian Hahn  ret i1 %c.5
165c259a2b9SFlorian Hahn}
166c259a2b9SFlorian Hahn
167c259a2b9SFlorian Hahndefine i1 @ult_signed_pos_constant(i8 %a) {
168c259a2b9SFlorian Hahn; CHECK-LABEL: @ult_signed_pos_constant(
169c259a2b9SFlorian Hahn; CHECK-NEXT:    [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], 4
170c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]
171c259a2b9SFlorian Hahn; CHECK:       then:
17292f87787SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
17392f87787SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true
174c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
175c259a2b9SFlorian Hahn; CHECK:       else:
176c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 0
177c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp slt i8 [[A]], 4
178c259a2b9SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]]
179c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i8 [[A]], 5
180c259a2b9SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
181c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_4]]
182c259a2b9SFlorian Hahn;
183c259a2b9SFlorian Hahn  %a.ult.4 = icmp ult i8 %a, 4
184c259a2b9SFlorian Hahn  br i1 %a.ult.4, label %then, label %else
185c259a2b9SFlorian Hahn
186c259a2b9SFlorian Hahnthen:
187c259a2b9SFlorian Hahn  %t.0 = icmp sge i8 %a, 0
188c259a2b9SFlorian Hahn  %t.1 = icmp slt i8 %a, 4
189c259a2b9SFlorian Hahn  %res.1 = xor i1 %t.0, %t.1
190c259a2b9SFlorian Hahn
191c259a2b9SFlorian Hahn  %c.0 = icmp slt i8 %a, 5
192c259a2b9SFlorian Hahn  %res.2 = xor i1 %res.1, %c.0
193c259a2b9SFlorian Hahn  ret i1 %res.2
194c259a2b9SFlorian Hahn
195c259a2b9SFlorian Hahnelse:
196c259a2b9SFlorian Hahn  %c.2 = icmp sge i8 %a, 0
197c259a2b9SFlorian Hahn  %c.3 = icmp slt i8 %a, 4
198c259a2b9SFlorian Hahn  %res.3 = xor i1 %c.2, %c.3
199c259a2b9SFlorian Hahn
200c259a2b9SFlorian Hahn  %c.4 = icmp slt i8 %a, 5
201c259a2b9SFlorian Hahn  %res.4 = xor i1 %res.3, %c.4
202c259a2b9SFlorian Hahn
203c259a2b9SFlorian Hahn  ret i1 %res.4
204c259a2b9SFlorian Hahn}
205c259a2b9SFlorian Hahn
206c259a2b9SFlorian Hahndefine i1 @ult_signed_neg_constant(i8 %a) {
207c259a2b9SFlorian Hahn; CHECK-LABEL: @ult_signed_neg_constant(
208c259a2b9SFlorian Hahn; CHECK-NEXT:    [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], -2
209c259a2b9SFlorian Hahn; CHECK-NEXT:    br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]
210c259a2b9SFlorian Hahn; CHECK:       then:
211c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp sge i8 [[A]], 0
212c259a2b9SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[A]], -2
213c259a2b9SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_0]], [[C_1]]
214c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
215c259a2b9SFlorian Hahn; CHECK:       else:
216c259a2b9SFlorian Hahn; CHECK-NEXT:    ret i1 false
217c259a2b9SFlorian Hahn;
218c259a2b9SFlorian Hahn  %a.ult.4 = icmp ult i8 %a, -2
219c259a2b9SFlorian Hahn  br i1 %a.ult.4, label %then, label %else
220c259a2b9SFlorian Hahn
221c259a2b9SFlorian Hahnthen:
222c259a2b9SFlorian Hahn  %c.0 = icmp sge i8 %a, 0
223c259a2b9SFlorian Hahn  %c.1 = icmp slt i8 %a, -2
224c259a2b9SFlorian Hahn  %res.1 = xor i1 %c.0, %c.1
225c259a2b9SFlorian Hahn  ret i1 %res.1
226c259a2b9SFlorian Hahn
227c259a2b9SFlorian Hahnelse:
228c259a2b9SFlorian Hahn  ret i1 0
229c259a2b9SFlorian Hahn}
230681315d1SAntonio Frighetto
231681315d1SAntonio Frighettodefine i1 @ule_signed_pos_constant_1(i8 %a, i8 %b) {
232681315d1SAntonio Frighetto; CHECK-LABEL: @ule_signed_pos_constant_1(
233681315d1SAntonio Frighetto; CHECK-NEXT:    [[B_NON_NEG:%.*]] = icmp sge i8 [[B:%.*]], 0
234681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[B_NON_NEG]])
235681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_ULE_B:%.*]] = icmp ule i8 [[A:%.*]], [[B]]
236681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[A_ULE_B]])
237681315d1SAntonio Frighetto; CHECK-NEXT:    [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]]
238241848b9SAntonio Frighetto; CHECK-NEXT:    [[RESULT_XOR:%.*]] = xor i1 true, [[SLT_TEST]]
239681315d1SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RESULT_XOR]]
240681315d1SAntonio Frighetto;
241681315d1SAntonio Frighetto  %b_non_neg = icmp sge i8 %b, 0
242681315d1SAntonio Frighetto  call void @llvm.assume(i1 %b_non_neg)
243681315d1SAntonio Frighetto  %a_ule_b = icmp ule i8 %a, %b
244681315d1SAntonio Frighetto  call void @llvm.assume(i1 %a_ule_b)
245681315d1SAntonio Frighetto
246681315d1SAntonio Frighetto  %sle_test = icmp sle i8 %a, %b
247681315d1SAntonio Frighetto  %slt_test = icmp slt i8 %a, %b
248681315d1SAntonio Frighetto  %result_xor = xor i1 %sle_test, %slt_test
249681315d1SAntonio Frighetto
250681315d1SAntonio Frighetto  ret i1 %result_xor
251681315d1SAntonio Frighetto}
252681315d1SAntonio Frighetto
253681315d1SAntonio Frighettodefine i1 @ule_signed_pos_constant_2(i8 %a) {
254681315d1SAntonio Frighetto; CHECK-LABEL: @ule_signed_pos_constant_2(
255681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_ULT_4:%.*]] = icmp ule i8 [[A:%.*]], 4
256681315d1SAntonio Frighetto; CHECK-NEXT:    br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]
257681315d1SAntonio Frighetto; CHECK:       then:
258241848b9SAntonio Frighetto; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
259241848b9SAntonio Frighetto; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true
260681315d1SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RES_2]]
261681315d1SAntonio Frighetto; CHECK:       else:
262681315d1SAntonio Frighetto; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 0
263681315d1SAntonio Frighetto; CHECK-NEXT:    [[C_3:%.*]] = icmp sle i8 [[A]], 4
264681315d1SAntonio Frighetto; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]]
265681315d1SAntonio Frighetto; CHECK-NEXT:    [[C_4:%.*]] = icmp sle i8 [[A]], 5
266681315d1SAntonio Frighetto; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
267681315d1SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RES_4]]
268681315d1SAntonio Frighetto;
269681315d1SAntonio Frighetto  %a.ult.4 = icmp ule i8 %a, 4
270681315d1SAntonio Frighetto  br i1 %a.ult.4, label %then, label %else
271681315d1SAntonio Frighetto
272681315d1SAntonio Frighettothen:
273681315d1SAntonio Frighetto  %t.0 = icmp sge i8 %a, 0
274681315d1SAntonio Frighetto  %t.1 = icmp sle i8 %a, 4
275681315d1SAntonio Frighetto  %res.1 = xor i1 %t.0, %t.1
276681315d1SAntonio Frighetto
277681315d1SAntonio Frighetto  %c.0 = icmp sle i8 %a, 5
278681315d1SAntonio Frighetto  %res.2 = xor i1 %res.1, %c.0
279681315d1SAntonio Frighetto  ret i1 %res.2
280681315d1SAntonio Frighetto
281681315d1SAntonio Frighettoelse:
282681315d1SAntonio Frighetto  %c.2 = icmp sge i8 %a, 0
283681315d1SAntonio Frighetto  %c.3 = icmp sle i8 %a, 4
284681315d1SAntonio Frighetto  %res.3 = xor i1 %c.2, %c.3
285681315d1SAntonio Frighetto
286681315d1SAntonio Frighetto  %c.4 = icmp sle i8 %a, 5
287681315d1SAntonio Frighetto  %res.4 = xor i1 %res.3, %c.4
288681315d1SAntonio Frighetto
289681315d1SAntonio Frighetto  ret i1 %res.4
290681315d1SAntonio Frighetto}
291681315d1SAntonio Frighetto
292681315d1SAntonio Frighettodefine i1 @uge_assumed_positive_values(i8 %a, i8 %b) {
293681315d1SAntonio Frighetto; CHECK-LABEL: @uge_assumed_positive_values(
294681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0
295681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NON_NEG]])
296681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_UGT_B:%.*]] = icmp uge i8 [[A]], [[B:%.*]]
297681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[A_UGT_B]])
298241848b9SAntonio Frighetto; CHECK-NEXT:    ret i1 true
299681315d1SAntonio Frighetto;
300681315d1SAntonio Frighetto  %a_non_neg = icmp sge i8 %a, 0
301681315d1SAntonio Frighetto  call void @llvm.assume(i1 %a_non_neg)
302681315d1SAntonio Frighetto  %a_ugt_b = icmp uge i8 %a, %b
303681315d1SAntonio Frighetto  call void @llvm.assume(i1 %a_ugt_b)
304681315d1SAntonio Frighetto
305681315d1SAntonio Frighetto  %result = icmp sge i8 %a, %b
306681315d1SAntonio Frighetto
307681315d1SAntonio Frighetto  ret i1 %result
308681315d1SAntonio Frighetto}
309681315d1SAntonio Frighetto
310681315d1SAntonio Frighettodefine i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {
311681315d1SAntonio Frighetto; CHECK-LABEL: @ugt_assumed_positive_values(
312681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0
313681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NON_NEG]])
314681315d1SAntonio Frighetto; CHECK-NEXT:    [[A_UGT_B:%.*]] = icmp ugt i8 [[A]], [[B:%.*]]
315681315d1SAntonio Frighetto; CHECK-NEXT:    call void @llvm.assume(i1 [[A_UGT_B]])
316241848b9SAntonio Frighetto; CHECK-NEXT:    ret i1 true
317681315d1SAntonio Frighetto;
318681315d1SAntonio Frighetto  %a_non_neg = icmp sge i8 %a, 0
319681315d1SAntonio Frighetto  call void @llvm.assume(i1 %a_non_neg)
320681315d1SAntonio Frighetto  %a_ugt_b = icmp ugt i8 %a, %b
321681315d1SAntonio Frighetto  call void @llvm.assume(i1 %a_ugt_b)
322681315d1SAntonio Frighetto
323681315d1SAntonio Frighetto  %result = icmp sgt i8 %a, %b
324681315d1SAntonio Frighetto
325681315d1SAntonio Frighetto  ret i1 %result
326681315d1SAntonio Frighetto}
327681315d1SAntonio Frighetto
328681315d1SAntonio Frighettodeclare void @llvm.assume(i1)
329