blob: 19e61930d755816ae804ef9bb88d1a5454d3987a [file] [log] [blame]
Philip Reames13f023c2015-09-28 17:14:24 +00001; 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}