xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll (revision 3c127e83c07c3791e86413c22a414a030d4302e3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4define void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) {
5; CHECK-LABEL: @test.not.uge.ult(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
8; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
9; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
10; CHECK:       if.then:
11; CHECK-NEXT:    ret void
12; CHECK:       if.end:
13; CHECK-NEXT:    [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
14; CHECK-NEXT:    call void @use(i1 [[T_0]])
15; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
16; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
17; CHECK-NEXT:    call void @use(i1 [[T_1]])
18; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
19; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
20; CHECK-NEXT:    call void @use(i1 [[T_2]])
21; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
22; CHECK-NEXT:    call void @use(i1 true)
23; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
24; CHECK-NEXT:    call void @use(i1 true)
25; CHECK-NEXT:    ret void
26;
27entry:
28  %sub.ptr.i = sub nuw i8 %start, 3
29  %c.1 = icmp uge i8 %sub.ptr.i, %high
30  br i1 %c.1, label %if.then, label %if.end
31
32if.then:                                          ; preds = %entry
33  ret void
34
35if.end:                                           ; preds = %entry
36  %t.0 = icmp ult i8 %start, %high
37  call void @use(i1 %t.0)
38  %start.1 = sub nuw i8 %start, 1
39  %t.1 = icmp ult i8 %start.1, %high
40  call void @use(i1 %t.1)
41  %start.2 = sub nuw i8 %start, 2
42  %t.2 = icmp ult i8 %start.2, %high
43  call void @use(i1 %t.2)
44  %start.3 = sub nuw i8 %start, 3
45  %t.3 = icmp ult i8 %start.3, %high
46  call void @use(i1 %t.3)
47  %start.4 = sub nuw i8 %start, 4
48  %c.4 = icmp ult i8 %start.4, %high
49  call void @use(i1 %c.4)
50  ret void
51}
52
53define void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) {
54; CHECK-LABEL: @test.not.uge.ule(
55; CHECK-NEXT:  entry:
56; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
57; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
58; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
59; CHECK:       if.then:
60; CHECK-NEXT:    ret void
61; CHECK:       if.end:
62; CHECK-NEXT:    [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
63; CHECK-NEXT:    call void @use(i1 [[T_0]])
64; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
65; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]]
66; CHECK-NEXT:    call void @use(i1 [[T_1]])
67; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
68; CHECK-NEXT:    call void @use(i1 true)
69; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
70; CHECK-NEXT:    call void @use(i1 true)
71; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
72; CHECK-NEXT:    call void @use(i1 true)
73; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
74; CHECK-NEXT:    call void @use(i1 true)
75; CHECK-NEXT:    ret void
76;
77entry:
78  %sub.ptr.i = sub nuw i8 %start, 3
79  %c.1 = icmp uge i8 %sub.ptr.i, %high
80  br i1 %c.1, label %if.then, label %if.end
81
82if.then:                                          ; preds = %entry
83  ret void
84
85if.end:                                           ; preds = %entry
86  %t.0 = icmp ule i8 %start, %high
87  call void @use(i1 %t.0)
88  %start.1 = sub nuw i8 %start, 1
89  %t.1 = icmp ule i8 %start.1, %high
90  call void @use(i1 %t.1)
91  %start.2 = sub nuw i8 %start, 2
92  %t.2 = icmp ule i8 %start.2, %high
93  call void @use(i1 %t.2)
94  %start.3 = sub nuw i8 %start, 3
95  %t.3 = icmp ule i8 %start.3, %high
96  call void @use(i1 %t.3)
97  %start.4 = sub nuw i8 %start, 4
98  %t.4 = icmp ule i8 %start.4, %high
99  call void @use(i1 %t.4)
100
101  %start.5 = sub nuw i8 %start, 5
102  %c.5 = icmp ule i8 %start.5, %high
103  call void @use(i1 %c.5)
104
105  ret void
106}
107
108define void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) {
109; CHECK-LABEL: @test.not.uge.ugt(
110; CHECK-NEXT:  entry:
111; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
112; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
113; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
114; CHECK:       if.then:
115; CHECK-NEXT:    ret void
116; CHECK:       if.end:
117; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
118; CHECK-NEXT:    call void @use(i1 [[F_0]])
119; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
120; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]]
121; CHECK-NEXT:    call void @use(i1 [[F_1]])
122; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
123; CHECK-NEXT:    call void @use(i1 false)
124; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
125; CHECK-NEXT:    call void @use(i1 false)
126; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
127; CHECK-NEXT:    call void @use(i1 false)
128; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
129; CHECK-NEXT:    call void @use(i1 false)
130; CHECK-NEXT:    ret void
131;
132entry:
133  %sub.ptr.i = sub nuw i8 %start, 3
134  %c.1 = icmp uge i8 %sub.ptr.i, %high
135  br i1 %c.1, label %if.then, label %if.end
136
137if.then:                                          ; preds = %entry
138  ret void
139
140if.end:                                           ; preds = %entry
141  %f.0 = icmp ugt i8 %start, %high
142  call void @use(i1 %f.0)
143
144  %start.1 = sub nuw i8 %start, 1
145  %f.1 = icmp ugt i8 %start.1, %high
146  call void @use(i1 %f.1)
147
148  %start.2 = sub nuw i8 %start, 2
149  %f.2 = icmp ugt i8 %start.2, %high
150  call void @use(i1 %f.2)
151
152  %start.3 = sub nuw i8 %start, 3
153  %f.3 = icmp ugt i8 %start.3, %high
154  call void @use(i1 %f.3)
155
156  %start.4 = sub nuw i8 %start, 4
157  %f.4 = icmp ugt i8 %start.4, %high
158  call void @use(i1 %f.4)
159
160  %start.5 = sub nuw i8 %start, 5
161  %c.5 = icmp ugt i8 %start.5, %high
162  call void @use(i1 %c.5)
163
164  ret void
165}
166
167define void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) {
168; CHECK-LABEL: @test.not.uge.uge(
169; CHECK-NEXT:  entry:
170; CHECK-NEXT:    [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
171; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]]
172; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
173; CHECK:       if.then:
174; CHECK-NEXT:    ret void
175; CHECK:       if.end:
176; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
177; CHECK-NEXT:    call void @use(i1 [[F_0]])
178; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
179; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
180; CHECK-NEXT:    call void @use(i1 [[F_1]])
181; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
182; CHECK-NEXT:    [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
183; CHECK-NEXT:    call void @use(i1 [[F_2]])
184; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
185; CHECK-NEXT:    call void @use(i1 false)
186; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
187; CHECK-NEXT:    call void @use(i1 false)
188; CHECK-NEXT:    [[START_5:%.*]] = sub nuw i8 [[START]], 5
189; CHECK-NEXT:    call void @use(i1 false)
190; CHECK-NEXT:    ret void
191;
192entry:
193  %sub.ptr.i = sub nuw i8 %start, 3
194  %c.1 = icmp uge i8 %sub.ptr.i, %high
195  br i1 %c.1, label %if.then, label %if.end
196
197if.then:                                          ; preds = %entry
198  ret void
199
200if.end:                                           ; preds = %entry
201  %f.0 = icmp ugt i8 %start, %high
202  call void @use(i1 %f.0)
203
204  %start.1 = sub nuw i8 %start, 1
205  %f.1 = icmp uge i8 %start.1, %high
206  call void @use(i1 %f.1)
207
208  %start.2 = sub nuw i8 %start, 2
209  %f.2 = icmp uge i8 %start.2, %high
210  call void @use(i1 %f.2)
211
212  %start.3 = sub nuw i8 %start, 3
213  %f.3 = icmp uge i8 %start.3, %high
214  call void @use(i1 %f.3)
215
216  %start.4 = sub nuw i8 %start, 4
217  %c.4 = icmp uge i8 %start.4, %high
218  call void @use(i1 %c.4)
219
220  %start.5 = sub nuw i8 %start, 5
221  %c.5 = icmp uge i8 %start.5, %high
222  call void @use(i1 %c.5)
223
224  ret void
225}
226
227define i16 @test_pr53123_sub_constraint_sign(i16 %v) {
228; CHECK-LABEL: @test_pr53123_sub_constraint_sign(
229; CHECK-NEXT:  bb.0:
230; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i16 32767, [[V:%.*]]
231; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i16 [[V]], [[SUB]]
232; CHECK-NEXT:    br i1 [[CMP1]], label [[BB_2:%.*]], label [[BB_1:%.*]]
233; CHECK:       bb.1:
234; CHECK-NEXT:    [[ADD:%.*]] = shl nuw nsw i16 [[V]], 1
235; CHECK-NEXT:    [[SUB9:%.*]] = sub nuw nsw i16 32767, [[ADD]]
236; CHECK-NEXT:    [[CMP11:%.*]] = icmp ugt i16 [[ADD]], [[SUB9]]
237; CHECK-NEXT:    br i1 [[CMP11]], label [[BB_3:%.*]], label [[BB_2]]
238; CHECK:       bb.2:
239; CHECK-NEXT:    ret i16 1
240; CHECK:       bb.3:
241; CHECK-NEXT:    ret i16 0
242;
243bb.0:
244  %sub = sub nuw nsw i16 32767, %v
245  %cmp1 = icmp ugt i16 %v, %sub
246  br i1 %cmp1, label %bb.2, label %bb.1
247
248bb.1:
249  %add = shl nuw nsw i16 %v, 1
250  %sub9 = sub nuw nsw i16 32767, %add
251  %cmp11 = icmp ugt i16 %add, %sub9
252  br i1 %cmp11, label %bb.3, label %bb.2
253
254bb.2:
255  ret i16 1
256
257bb.3:
258  ret i16 0
259}
260
261declare void @use(i1)
262
263define i1 @sub_nuw_i16_simp(i16 %a) {
264; CHECK-LABEL: @sub_nuw_i16_simp(
265; CHECK-NEXT:  entry:
266; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], 305
267; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
268; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
269; CHECK:       exit.1:
270; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i16 [[A]], 0
271; CHECK-NEXT:    ret i1 [[C_2]]
272; CHECK:       exit.2:
273; CHECK-NEXT:    ret i1 true
274;
275entry:
276  %neg2 = sub nuw i16 %a, 305
277  %c.1 = icmp ugt i16 0, %neg2
278  br i1 %c.1, label %exit.1, label %exit.2
279
280exit.1:
281  %c.2 = icmp ugt i16 %a, 0
282  ret i1 %c.2
283
284exit.2:
285  %c.3 = icmp ugt i16 %a, 0
286  ret i1 %c.3
287}
288
289define i1 @sub_nuw_i64_simp(i64 %a) {
290; CHECK-LABEL: @sub_nuw_i64_simp(
291; CHECK-NEXT:  entry:
292; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i64 [[A:%.*]], 305
293; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
294; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
295; CHECK:       exit.1:
296; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i64 [[A]], 0
297; CHECK-NEXT:    ret i1 [[C_2]]
298; CHECK:       exit.2:
299; CHECK-NEXT:    ret i1 true
300;
301entry:
302  %neg2 = sub nuw i64 %a, 305
303  %c.1 = icmp ugt i64 0, %neg2
304  br i1 %c.1, label %exit.1, label %exit.2
305
306exit.1:
307  %c.2 = icmp ugt i64 %a, 0
308  ret i1 %c.2
309
310exit.2:
311  %c.3 = icmp ugt i64 %a, 0
312  ret i1 %c.3
313}
314
315define i1 @sub_nuw_neg_i16(i16 %a) {
316; CHECK-LABEL: @sub_nuw_neg_i16(
317; CHECK-NEXT:  entry:
318; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], -305
319; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
320; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
321; CHECK:       exit.1:
322; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i16 [[A]], 0
323; CHECK-NEXT:    ret i1 [[C_2]]
324; CHECK:       exit.2:
325; CHECK-NEXT:    ret i1 true
326;
327entry:
328  %neg2 = sub nuw i16 %a, -305
329  %c.1 = icmp ugt i16 0, %neg2
330  br i1 %c.1, label %exit.1, label %exit.2
331
332exit.1:
333  %c.2 = icmp ugt i16 %a, 0
334  ret i1 %c.2
335
336exit.2:
337  %c.3 = icmp ugt i16 %a, 0
338  ret i1 %c.3
339}
340
341declare void @llvm.assume(i1)
342
343define i1 @wrapping_offset_sum(i64 %x) {
344; CHECK-LABEL: @wrapping_offset_sum(
345; CHECK-NEXT:    [[NON_ZERO:%.*]] = icmp ugt i64 [[X:%.*]], 0
346; CHECK-NEXT:    call void @llvm.assume(i1 [[NON_ZERO]])
347; CHECK-NEXT:    [[ADD:%.*]] = sub nuw i64 [[X]], 9223372036854775802
348; CHECK-NEXT:    [[ULT:%.*]] = icmp ugt i64 200, [[ADD]]
349; CHECK-NEXT:    ret i1 [[ULT]]
350;
351  %non.zero = icmp ugt i64 %x, 0
352  call void @llvm.assume(i1 %non.zero)
353  %add = sub nuw i64 %x, 9223372036854775802
354  %ult = icmp ugt i64 200, %add
355  ret i1 %ult
356}
357
358define i1 @sub_nuw_i64_signed_min(i64 %a) {
359; CHECK-LABEL: @sub_nuw_i64_signed_min(
360; CHECK-NEXT:  entry:
361; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i64 [[A:%.*]], -9223372036854775808
362; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 [[A]], [[SUB]]
363; CHECK-NEXT:    ret i1 [[C_1]]
364;
365entry:
366  %sub = sub nuw i64 %a, -9223372036854775808
367  %c.1 = icmp ugt i64 %a, %sub
368  ret i1 %c.1
369}
370
371define i1 @sub_nuw_i64_signed_min_const(i64 %a) {
372; CHECK-LABEL: @sub_nuw_i64_signed_min_const(
373; CHECK-NEXT:  entry:
374; CHECK-NEXT:    [[NEG2:%.*]] = sub nuw i64 0, -9223372036854775808
375; CHECK-NEXT:    [[C:%.*]] = icmp ugt i64 [[NEG2]], 0
376; CHECK-NEXT:    ret i1 [[C]]
377;
378entry:
379  %neg2 = sub nuw i64 0, -9223372036854775808
380  %c = icmp ugt i64 %neg2, 0
381  ret i1 %c
382}
383
384define i1 @pr76713(i16 %i1, i16 %i3) {
385; CHECK-LABEL: @pr76713(
386; CHECK-NEXT:  entry:
387; CHECK-NEXT:    [[C1:%.*]] = icmp ult i16 [[I1:%.*]], -1
388; CHECK-NEXT:    [[C2:%.*]] = icmp uge i16 [[I1]], -3
389; CHECK-NEXT:    [[C3:%.*]] = icmp ult i16 [[I3:%.*]], 2
390; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C1]], [[C2]]
391; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[AND]], [[C3]]
392; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
393; CHECK:       then:
394; CHECK-NEXT:    [[SUB:%.*]] = sub nuw nsw i16 [[I1]], -3
395; CHECK-NEXT:    [[ARRAYIDX_IDX:%.*]] = mul nuw nsw i16 [[I3]], 4
396; CHECK-NEXT:    [[I6:%.*]] = add nuw nsw i16 [[ARRAYIDX_IDX]], [[SUB]]
397; CHECK-NEXT:    [[C4:%.*]] = icmp ult i16 12, [[I6]]
398; CHECK-NEXT:    ret i1 [[C4]]
399; CHECK:       else:
400; CHECK-NEXT:    ret i1 false
401;
402entry:
403  %c1 = icmp ult i16 %i1, -1
404  %c2 = icmp uge i16 %i1, -3
405  %c3 = icmp ult i16 %i3, 2
406  %and = and i1 %c1, %c2
407  %and.2 = and i1 %and, %c3
408  br i1 %and, label %then, label %else
409
410then:
411  %sub = sub nuw nsw i16 %i1, -3
412  %arrayidx.idx = mul nuw nsw i16 %i3, 4
413  %i6 = add nuw nsw i16 %arrayidx.idx, %sub
414  %c4 = icmp ult i16 12, %i6
415  ret i1 %c4
416
417else:
418  ret i1 0
419}
420
421define void @sub_nuw_chained_positive_constants(i16 %a) {
422; CHECK-LABEL: @sub_nuw_chained_positive_constants(
423; CHECK-NEXT:  entry:
424; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[A:%.*]], 10
425; CHECK-NEXT:    [[SUB2:%.*]] = sub nuw i16 [[SUB1]], 20
426; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i16 [[SUB2]], 90
427; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
428; CHECK:       exit.1:
429; CHECK-NEXT:    call void @use(i1 true)
430; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i16 [[A]], 121
431; CHECK-NEXT:    call void @use(i1 [[C_3]])
432; CHECK-NEXT:    ret void
433; CHECK:       exit.2:
434; CHECK-NEXT:    call void @use(i1 false)
435; CHECK-NEXT:    call void @use(i1 false)
436; CHECK-NEXT:    ret void
437;
438entry:
439  %sub1 = sub nuw i16 %a, 10
440  %sub2 = sub nuw i16 %sub1, 20
441  %c.1 = icmp ugt i16 %sub2, 90
442  br i1 %c.1, label %exit.1, label %exit.2
443
444exit.1:
445  %c.2 = icmp ugt i16 %a, 120
446  call void @use(i1 %c.2)
447  %c.3 = icmp ugt i16 %a, 121
448  call void @use(i1 %c.3)
449  ret void
450
451exit.2:
452  %c.4 = icmp ugt i16 %a, 120
453  call void @use(i1 %c.4)
454  %c.5 = icmp ugt i16 %a, 121
455  call void @use(i1 %c.5)
456  ret void
457}
458
459define void @sub_nuw_chained_negative_constants(i8 %a) {
460; CHECK-LABEL: @sub_nuw_chained_negative_constants(
461; CHECK-NEXT:  entry:
462; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i8 [[A:%.*]], 10
463; CHECK-NEXT:    [[SUB2:%.*]] = sub nuw i8 [[SUB1]], -126
464; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[SUB2]], 20
465; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
466; CHECK:       exit.1:
467; CHECK-NEXT:    call void @use(i1 true)
468; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[A]], -95
469; CHECK-NEXT:    call void @use(i1 [[C_3]])
470; CHECK-NEXT:    ret void
471; CHECK:       exit.2:
472; CHECK-NEXT:    call void @use(i1 false)
473; CHECK-NEXT:    call void @use(i1 false)
474; CHECK-NEXT:    ret void
475;
476entry:
477  %sub1 = sub nuw i8 %a, 10
478  %sub2 = sub nuw i8 %sub1, 130
479  %c.1 = icmp ugt i8 %sub2, 20
480  br i1 %c.1, label %exit.1, label %exit.2
481
482exit.1:
483  %c.2 = icmp ugt i8 %a, 160
484  call void @use(i1 %c.2)
485  %c.3 = icmp ugt i8 %a, 161
486  call void @use(i1 %c.3)
487  ret void
488
489
490exit.2:
491  %c.4 = icmp ugt i8 %a, 160
492  call void @use(i1 %c.4)
493  %c.5 = icmp ugt i8 %a, 161
494  call void @use(i1 %c.5)
495  ret void
496}
497