xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/wrapping-math.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
114da287eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
314da287eSFlorian Hahn
414da287eSFlorian Hahndefine i1 @wrapping_add_unknown_1(i8 %a) {
514da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_unknown_1(
614da287eSFlorian Hahn; CHECK-NEXT:  entry:
714da287eSFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add i8 [[A:%.*]], -1
814da287eSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[SUB]], 0
914da287eSFlorian Hahn; CHECK-NEXT:    ret i1 [[CMP]]
1014da287eSFlorian Hahn;
1114da287eSFlorian Hahnentry:
1214da287eSFlorian Hahn  %sub = add i8 %a, -1
1314da287eSFlorian Hahn  %cmp = icmp eq i8 %sub, 0
1414da287eSFlorian Hahn  ret i1 %cmp
1514da287eSFlorian Hahn}
1614da287eSFlorian Hahn
1714da287eSFlorian Hahndefine i1 @wrapping_add_known_1(i8 %a) {
1814da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_known_1(
1914da287eSFlorian Hahn; CHECK-NEXT:  entry:
2014da287eSFlorian Hahn; CHECK-NEXT:    [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1
2114da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]]
2214da287eSFlorian Hahn; CHECK:       then:
2314da287eSFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[A]], -1
2466400fc2SFlorian Hahn; CHECK-NEXT:    ret i1 true
2514da287eSFlorian Hahn; CHECK:       else:
2614da287eSFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add i8 [[A]], -1
2714da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 0
2814da287eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_2]]
2914da287eSFlorian Hahn;
3014da287eSFlorian Hahnentry:
3114da287eSFlorian Hahn  %pre = icmp eq i8 %a, 1
3214da287eSFlorian Hahn  br i1 %pre, label %then, label %else
3314da287eSFlorian Hahn
3414da287eSFlorian Hahnthen:
3514da287eSFlorian Hahn  %sub.1 = add i8 %a, -1
3614da287eSFlorian Hahn  %c.1 = icmp eq i8 %sub.1, 0
3714da287eSFlorian Hahn  ret i1 %c.1
3814da287eSFlorian Hahn
3914da287eSFlorian Hahnelse:
4014da287eSFlorian Hahn  %sub.2 = add i8 %a, -1
4114da287eSFlorian Hahn  %c.2 = icmp eq i8 %sub.2, 0
4214da287eSFlorian Hahn  ret i1 %c.2
4314da287eSFlorian Hahn}
4414da287eSFlorian Hahn
4514da287eSFlorian Hahndefine i1 @wrapping_add_unknown_2(i8 %a) {
4614da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_unknown_2(
4714da287eSFlorian Hahn; CHECK-NEXT:  entry:
4814da287eSFlorian Hahn; CHECK-NEXT:    [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 0
4914da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]]
5014da287eSFlorian Hahn; CHECK:       then:
5114da287eSFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[A]], -1
5214da287eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8 [[SUB_1]], 0
5314da287eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
5414da287eSFlorian Hahn; CHECK:       else:
5514da287eSFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add i8 [[A]], -1
5614da287eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 0
5714da287eSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_2]]
5814da287eSFlorian Hahn;
5914da287eSFlorian Hahnentry:
6014da287eSFlorian Hahn  %pre = icmp eq i8 %a, 0
6114da287eSFlorian Hahn  br i1 %pre, label %then, label %else
6214da287eSFlorian Hahn
6314da287eSFlorian Hahnthen:
6414da287eSFlorian Hahn  %sub.1 = add i8 %a, -1
6514da287eSFlorian Hahn  %c.1 = icmp eq i8 %sub.1, 0
6614da287eSFlorian Hahn  ret i1 %c.1
6714da287eSFlorian Hahn
6814da287eSFlorian Hahnelse:
6914da287eSFlorian Hahn  %sub.2 = add i8 %a, -1
7014da287eSFlorian Hahn  %c.2 = icmp eq i8 %sub.2, 0
7114da287eSFlorian Hahn  ret i1 %c.2
7214da287eSFlorian Hahn}
73d1e1a405SFlorian Hahn
74d1e1a405SFlorian Hahn; Test from https://github.com/llvm/llvm-project/issues/48253.
75d1e1a405SFlorian Hahndefine i1 @test_48253_eq_ne(i8 %a, i8 %b) {
76d1e1a405SFlorian Hahn; CHECK-LABEL: @test_48253_eq_ne(
77d1e1a405SFlorian Hahn; CHECK-NEXT:  entry:
78d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_1:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]
79d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_2:%.*]] = icmp eq i8 [[B]], 0
80d1e1a405SFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP_1]], [[CMP_2]]
81d1e1a405SFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[EXIT_1:%.*]], label [[IF_END:%.*]]
82d1e1a405SFlorian Hahn; CHECK:       if.end:
83d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[B]], -1
84d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add i8 [[B]], -2
85d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[SUB_2]], [[A]]
8666400fc2SFlorian Hahn; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 true, [[C_2]]
87d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_1]]
88d1e1a405SFlorian Hahn; CHECK:       exit.1:
89d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_3:%.*]] = add i8 [[B]], -1
90d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[SUB_3]], [[A]]
91d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_4:%.*]] = add i8 [[B]], -2
92d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[SUB_4]], [[A]]
93d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[C_3]], [[C_4]]
94d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_2]]
95d1e1a405SFlorian Hahn;
96d1e1a405SFlorian Hahnentry:
97d1e1a405SFlorian Hahn  %cmp.1 = icmp ne i8 %a, %b
98d1e1a405SFlorian Hahn  %cmp.2 = icmp eq i8 %b, 0
99d1e1a405SFlorian Hahn  %or = or i1 %cmp.1, %cmp.2
100d1e1a405SFlorian Hahn  br i1 %or, label %exit.1, label %if.end
101d1e1a405SFlorian Hahn
102d1e1a405SFlorian Hahnif.end:
103d1e1a405SFlorian Hahn  %sub.1 = add i8 %b, -1
104d1e1a405SFlorian Hahn  %t.1 = icmp ult i8 %sub.1, %a
105d1e1a405SFlorian Hahn  %sub.2 = add i8 %b, -2
106d1e1a405SFlorian Hahn  %c.2 = icmp ult i8 %sub.2, %a
107d1e1a405SFlorian Hahn  %xor.1 = xor i1 %t.1, %c.2
108d1e1a405SFlorian Hahn  ret i1 %xor.1
109d1e1a405SFlorian Hahn
110d1e1a405SFlorian Hahnexit.1:
111d1e1a405SFlorian Hahn  %sub.3 = add i8 %b, -1
112d1e1a405SFlorian Hahn  %c.3 = icmp ult i8 %sub.3, %a
113d1e1a405SFlorian Hahn  %sub.4 = add i8 %b, -2
114d1e1a405SFlorian Hahn  %c.4 = icmp ult i8 %sub.4, %a
115d1e1a405SFlorian Hahn  %xor.2 = xor i1 %c.3, %c.4
116d1e1a405SFlorian Hahn  ret i1 %xor.2
117d1e1a405SFlorian Hahn}
118d1e1a405SFlorian Hahn
119d1e1a405SFlorian Hahndefine i1 @test_ult(i8 %a, i8 %b) {
120d1e1a405SFlorian Hahn; CHECK-LABEL: @test_ult(
121d1e1a405SFlorian Hahn; CHECK-NEXT:  entry:
122d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_1:%.*]] = icmp uge i8 [[A:%.*]], 20
123d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ult i8 [[A]], [[B:%.*]]
124d1e1a405SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
125d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[A]], -1
126d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add i8 [[A]], -2
127d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_3:%.*]] = add i8 [[A]], -20
128d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_4:%.*]] = add i8 [[A]], 21
129d1e1a405SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add i8 [[A]], 1
130d1e1a405SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]
131d1e1a405SFlorian Hahn; CHECK:       if.end:
13266400fc2SFlorian Hahn; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 true, true
13366400fc2SFlorian Hahn; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[XOR_1]], true
134d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[SUB_4]], [[B]]
135d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]
136d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[ADD_1]], [[B]]
137d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]
138d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_4]]
139d1e1a405SFlorian Hahn; CHECK:       exit.1:
140d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[SUB_1]], [[B]]
141d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[SUB_2]], [[B]]
142d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]
143d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ult i8 [[SUB_3]], [[B]]
144d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]
145d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ult i8 [[SUB_4]], [[B]]
146d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]
147d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ult i8 [[ADD_1]], [[B]]
148d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]
149d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_8]]
150d1e1a405SFlorian Hahn;
151d1e1a405SFlorian Hahnentry:
152d1e1a405SFlorian Hahn  %cmp.1 = icmp uge i8 %a, 20
153d1e1a405SFlorian Hahn  %cmp.2 = icmp ult i8 %a, %b
154d1e1a405SFlorian Hahn  %and = and i1 %cmp.1, %cmp.2
155d1e1a405SFlorian Hahn  %sub.1 = add i8 %a, -1
156d1e1a405SFlorian Hahn  %sub.2 = add i8 %a, -2
157d1e1a405SFlorian Hahn  %sub.3 = add i8 %a, -20
158d1e1a405SFlorian Hahn  %sub.4 = add i8 %a, 21
159d1e1a405SFlorian Hahn  %add.1 = add i8 %a, 1
160d1e1a405SFlorian Hahn  br i1 %and, label %if.end, label %exit.1
161d1e1a405SFlorian Hahn
162d1e1a405SFlorian Hahnif.end:
163d1e1a405SFlorian Hahn  %t.1 = icmp ult i8 %sub.1, %b
164d1e1a405SFlorian Hahn  %t.2 = icmp ult i8 %sub.2, %b
165d1e1a405SFlorian Hahn  %xor.1 = xor i1 %t.1, %t.2
166d1e1a405SFlorian Hahn
167d1e1a405SFlorian Hahn  %t.3 = icmp ult i8 %sub.3, %b
168d1e1a405SFlorian Hahn  %xor.2 = xor i1 %xor.1, %t.3
169d1e1a405SFlorian Hahn
170d1e1a405SFlorian Hahn  %c.1 = icmp ult i8 %sub.4, %b
171d1e1a405SFlorian Hahn  %xor.3 = xor i1 %xor.2, %c.1
172d1e1a405SFlorian Hahn
173d1e1a405SFlorian Hahn  %c.2 = icmp ult i8 %add.1, %b
174d1e1a405SFlorian Hahn  %xor.4 = xor i1 %xor.3, %c.2
175d1e1a405SFlorian Hahn  ret i1 %xor.4
176d1e1a405SFlorian Hahn
177d1e1a405SFlorian Hahnexit.1:
178d1e1a405SFlorian Hahn  %c.3 = icmp ult i8 %sub.1, %b
179d1e1a405SFlorian Hahn  %c.4 = icmp ult i8 %sub.2, %b
180d1e1a405SFlorian Hahn  %xor.5 = xor i1 %c.3, %c.4
181d1e1a405SFlorian Hahn
182d1e1a405SFlorian Hahn  %c.5 = icmp ult i8 %sub.3, %b
183d1e1a405SFlorian Hahn  %xor.6 = xor i1 %xor.5, %c.5
184d1e1a405SFlorian Hahn
185d1e1a405SFlorian Hahn  %c.6 = icmp ult i8 %sub.4, %b
186d1e1a405SFlorian Hahn  %xor.7 = xor i1 %xor.6, %c.6
187d1e1a405SFlorian Hahn
188d1e1a405SFlorian Hahn  %c.7 = icmp ult i8 %add.1, %b
189d1e1a405SFlorian Hahn  %xor.8 = xor i1 %xor.7, %c.7
190d1e1a405SFlorian Hahn  ret i1 %xor.8
191d1e1a405SFlorian Hahn}
192d1e1a405SFlorian Hahn
193d1e1a405SFlorian Hahndefine i1 @test_slt(i8 %a, i8 %b) {
194d1e1a405SFlorian Hahn; CHECK-LABEL: @test_slt(
195d1e1a405SFlorian Hahn; CHECK-NEXT:  entry:
196d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_1:%.*]] = icmp sge i8 [[A:%.*]], 20
197d1e1a405SFlorian Hahn; CHECK-NEXT:    [[CMP_2:%.*]] = icmp slt i8 [[A]], [[B:%.*]]
198d1e1a405SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]]
199d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[A]], -1
200d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add i8 [[A]], -2
201d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_3:%.*]] = add i8 [[A]], -20
202d1e1a405SFlorian Hahn; CHECK-NEXT:    [[SUB_4:%.*]] = add i8 [[A]], 21
203d1e1a405SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add i8 [[A]], 1
204d1e1a405SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]]
205d1e1a405SFlorian Hahn; CHECK:       if.end:
206d1e1a405SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i8 [[SUB_1]], [[B]]
207d1e1a405SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp slt i8 [[SUB_2]], [[B]]
208d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 [[T_1]], [[T_2]]
209d1e1a405SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp slt i8 [[SUB_3]], [[B]]
210d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[XOR_1]], [[T_3]]
211d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[SUB_4]], [[B]]
212d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]]
213d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i8 [[ADD_1]], [[B]]
214d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]]
215d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_4]]
216d1e1a405SFlorian Hahn; CHECK:       exit.1:
217d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp slt i8 [[SUB_1]], [[B]]
218d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i8 [[SUB_2]], [[B]]
219d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]]
220d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp slt i8 [[SUB_3]], [[B]]
221d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]]
222d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp slt i8 [[SUB_4]], [[B]]
223d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]]
224d1e1a405SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp slt i8 [[ADD_1]], [[B]]
225d1e1a405SFlorian Hahn; CHECK-NEXT:    [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]]
226d1e1a405SFlorian Hahn; CHECK-NEXT:    ret i1 [[XOR_8]]
227d1e1a405SFlorian Hahn;
228d1e1a405SFlorian Hahnentry:
229d1e1a405SFlorian Hahn  %cmp.1 = icmp sge i8 %a, 20
230d1e1a405SFlorian Hahn  %cmp.2 = icmp slt i8 %a, %b
231d1e1a405SFlorian Hahn  %and = and i1 %cmp.1, %cmp.2
232d1e1a405SFlorian Hahn  %sub.1 = add i8 %a, -1
233d1e1a405SFlorian Hahn  %sub.2 = add i8 %a, -2
234d1e1a405SFlorian Hahn  %sub.3 = add i8 %a, -20
235d1e1a405SFlorian Hahn  %sub.4 = add i8 %a, 21
236d1e1a405SFlorian Hahn  %add.1 = add i8 %a, 1
237d1e1a405SFlorian Hahn  br i1 %and, label %if.end, label %exit.1
238d1e1a405SFlorian Hahn
239d1e1a405SFlorian Hahnif.end:
240d1e1a405SFlorian Hahn  %t.1 = icmp slt i8 %sub.1, %b
241d1e1a405SFlorian Hahn  %t.2 = icmp slt i8 %sub.2, %b
242d1e1a405SFlorian Hahn  %xor.1 = xor i1 %t.1, %t.2
243d1e1a405SFlorian Hahn
244d1e1a405SFlorian Hahn  %t.3 = icmp slt i8 %sub.3, %b
245d1e1a405SFlorian Hahn  %xor.2 = xor i1 %xor.1, %t.3
246d1e1a405SFlorian Hahn
247d1e1a405SFlorian Hahn  %c.1 = icmp slt i8 %sub.4, %b
248d1e1a405SFlorian Hahn  %xor.3 = xor i1 %xor.2, %c.1
249d1e1a405SFlorian Hahn
250d1e1a405SFlorian Hahn  %c.2 = icmp slt i8 %add.1, %b
251d1e1a405SFlorian Hahn  %xor.4 = xor i1 %xor.3, %c.2
252d1e1a405SFlorian Hahn  ret i1 %xor.4
253d1e1a405SFlorian Hahn
254d1e1a405SFlorian Hahnexit.1:
255d1e1a405SFlorian Hahn  %c.3 = icmp slt i8 %sub.1, %b
256d1e1a405SFlorian Hahn  %c.4 = icmp slt i8 %sub.2, %b
257d1e1a405SFlorian Hahn  %xor.5 = xor i1 %c.3, %c.4
258d1e1a405SFlorian Hahn
259d1e1a405SFlorian Hahn  %c.5 = icmp slt i8 %sub.3, %b
260d1e1a405SFlorian Hahn  %xor.6 = xor i1 %xor.5, %c.5
261d1e1a405SFlorian Hahn
262d1e1a405SFlorian Hahn  %c.6 = icmp slt i8 %sub.4, %b
263d1e1a405SFlorian Hahn  %xor.7 = xor i1 %xor.6, %c.6
264d1e1a405SFlorian Hahn
265d1e1a405SFlorian Hahn  %c.7 = icmp slt i8 %add.1, %b
266d1e1a405SFlorian Hahn  %xor.8 = xor i1 %xor.7, %c.7
267d1e1a405SFlorian Hahn  ret i1 %xor.8
268d1e1a405SFlorian Hahn}
26962c19284SFlorian Hahn
27062c19284SFlorian Hahndefine i1 @wrapping_add_known_1_add_nuw(i8 %a) {
27162c19284SFlorian Hahn; CHECK-LABEL: @wrapping_add_known_1_add_nuw(
27262c19284SFlorian Hahn; CHECK-NEXT:  entry:
27362c19284SFlorian Hahn; CHECK-NEXT:    [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1
27462c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])
27562c19284SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[A]], -1
27662c19284SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[SUB_1]], 10
277*f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
278*f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
27962c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
28062c19284SFlorian Hahn;
28162c19284SFlorian Hahnentry:
28262c19284SFlorian Hahn  %pre = icmp eq i8 %a, 1
28362c19284SFlorian Hahn  call void @llvm.assume(i1 %pre)
28462c19284SFlorian Hahn  %sub.1 = add i8 %a, -1
28562c19284SFlorian Hahn  %add = add nuw i8 %sub.1, 10
28662c19284SFlorian Hahn  %t.1 = icmp uge i8 %add, 10
28762c19284SFlorian Hahn  %t.2 = icmp ule i8 %add, 10
28862c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %t.2
28962c19284SFlorian Hahn  %f.1 = icmp ult i8 %add, 10
29062c19284SFlorian Hahn  %res.2 = xor i1 %res.1, %f.1
29162c19284SFlorian Hahn  ret i1 %res.2
29262c19284SFlorian Hahn}
29362c19284SFlorian Hahn
29462c19284SFlorian Hahndefine i1 @add_nuw_wrapping_add_known_1(i8 %a) {
29562c19284SFlorian Hahn; CHECK-LABEL: @add_nuw_wrapping_add_known_1(
29662c19284SFlorian Hahn; CHECK-NEXT:  entry:
29762c19284SFlorian Hahn; CHECK-NEXT:    [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1
29862c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])
29962c19284SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[A]], 10
30062c19284SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[ADD]], -1
301*f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
302*f213128bSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
30362c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
30462c19284SFlorian Hahn;
30562c19284SFlorian Hahnentry:
30662c19284SFlorian Hahn  %pre = icmp eq i8 %a, 1
30762c19284SFlorian Hahn  call void @llvm.assume(i1 %pre)
30862c19284SFlorian Hahn  %add = add nuw i8 %a, 10
30962c19284SFlorian Hahn  %sub.1 = add i8 %add, -1
31062c19284SFlorian Hahn  %t.1 = icmp uge i8 %sub.1, 10
31162c19284SFlorian Hahn  %t.2 = icmp ule i8 %sub.1, 10
31262c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %t.2
31362c19284SFlorian Hahn  %f.1 = icmp ult i8 %sub.1, 10
31462c19284SFlorian Hahn  %res.2 = xor i1 %res.1, %f.1
31562c19284SFlorian Hahn  ret i1 %res.2
31662c19284SFlorian Hahn}
31762c19284SFlorian Hahn
31862c19284SFlorian Hahndefine i1 @add_nuw_wrapping_add_not_known_1(i8 %a) {
31962c19284SFlorian Hahn; CHECK-LABEL: @add_nuw_wrapping_add_not_known_1(
32062c19284SFlorian Hahn; CHECK-NEXT:  entry:
32162c19284SFlorian Hahn; CHECK-NEXT:    [[PRE:%.*]] = icmp sge i8 [[A:%.*]], -1
32262c19284SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE]])
32362c19284SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[A]], 10
32462c19284SFlorian Hahn; CHECK-NEXT:    [[SUB_1:%.*]] = add i8 [[ADD]], -1
32562c19284SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10
32662c19284SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10
32762c19284SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
32862c19284SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10
32962c19284SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
33062c19284SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
33162c19284SFlorian Hahn;
33262c19284SFlorian Hahnentry:
33362c19284SFlorian Hahn  %pre = icmp sge i8 %a, -1
33462c19284SFlorian Hahn  call void @llvm.assume(i1 %pre)
33562c19284SFlorian Hahn  %add = add nuw i8 %a, 10
33662c19284SFlorian Hahn  %sub.1 = add i8 %add, -1
33762c19284SFlorian Hahn  %t.1 = icmp uge i8 %sub.1, 10
33862c19284SFlorian Hahn  %t.2 = icmp ule i8 %sub.1, 10
33962c19284SFlorian Hahn  %res.1 = xor i1 %t.1, %t.2
34062c19284SFlorian Hahn  %f.1 = icmp ult i8 %sub.1, 10
34162c19284SFlorian Hahn  %res.2 = xor i1 %res.1, %f.1
34262c19284SFlorian Hahn  ret i1 %res.2
34362c19284SFlorian Hahn}
34462c19284SFlorian Hahn
34562c19284SFlorian Hahndeclare void @llvm.assume(i1)
346