1; RUN: opt -S %s -instsimplify | FileCheck %s
2
3; A ==> A -> true
4define i1 @test(i32 %length.i, i32 %i) {
5; CHECK-LABEL: @test
6; CHECK: ret i1 true
7  %var29 = icmp slt i32 %i, %length.i
8  %res = icmp uge i1 %var29, %var29
9  ret i1 %res
10}
11
12; i +_{nsw} C_{>0} <s L ==> i <s L -> true
13define i1 @test2(i32 %length.i, i32 %i) {
14; CHECK-LABEL: @test2
15; CHECK: ret i1 true
16  %iplus1 = add nsw i32 %i, 1
17  %var29 = icmp slt i32 %i, %length.i
18  %var30 = icmp slt i32 %iplus1, %length.i
19  %res = icmp ule i1 %var30, %var29
20  ret i1 %res
21}
22
23; i + C_{>0} <s L ==> i <s L -> unknown without the nsw
24define i1 @test2_neg(i32 %length.i, i32 %i) {
25; CHECK-LABEL: @test2_neg
26; CHECK:   ret i1 %res
27  %iplus1 = add i32 %i, 1
28  %var29 = icmp slt i32 %i, %length.i
29  %var30 = icmp slt i32 %iplus1, %length.i
30  %res = icmp ule i1 %var30, %var29
31  ret i1 %res
32}
33
34; sle is not implication
35define i1 @test2_neg2(i32 %length.i, i32 %i) {
36; CHECK-LABEL: @test2_neg2
37; CHECK:   ret i1 %res
38  %iplus1 = add i32 %i, 1
39  %var29 = icmp slt i32 %i, %length.i
40  %var30 = icmp slt i32 %iplus1, %length.i
41  %res = icmp sle i1 %var30, %var29
42  ret i1 %res
43}
44
45; The binary operator has to be an add
46define i1 @test2_neg3(i32 %length.i, i32 %i) {
47; CHECK-LABEL: @test2_neg3
48; CHECK:   ret i1 %res
49  %iplus1 = sub nsw i32 %i, 1
50  %var29 = icmp slt i32 %i, %length.i
51  %var30 = icmp slt i32 %iplus1, %length.i
52  %res = icmp ule i1 %var30, %var29
53  ret i1 %res
54}
55
56; i +_{nsw} C_{>0} <s L ==> i <s L -> true
57; With an inverted conditional (ule B A rather than canonical ugt A B
58define i1 @test3(i32 %length.i, i32 %i) {
59; CHECK-LABEL: @test3
60; CHECK: ret i1 true
61  %iplus1 = add nsw i32 %i, 1
62  %var29 = icmp slt i32 %i, %length.i
63  %var30 = icmp slt i32 %iplus1, %length.i
64  %res = icmp uge i1 %var29, %var30
65  ret i1 %res
66}
67
68; i +_{nuw} C_{>0} <u L ==> i <u L
69define i1 @test4(i32 %length.i, i32 %i) {
70; CHECK-LABEL: @test4
71; CHECK: ret i1 true
72  %iplus1 = add nuw i32 %i, 1
73  %var29 = icmp ult i32 %i, %length.i
74  %var30 = icmp ult i32 %iplus1, %length.i
75  %res = icmp ule i1 %var30, %var29
76  ret i1 %res
77}
78