blob: eb8db4224faf0040cfd6b420d30d29ed7dade9f9 [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
Sanjoy Dasc01b4d22015-11-06 19:01:03 +000068; i +_{nuw} C <u L ==> i <u L
Philip Reames13f023c2015-09-28 17:14:24 +000069define 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}
Philip Reames600a9152015-10-06 19:00:02 +000078
79; A ==> A for vectors
80define <4 x i1> @test5(<4 x i1> %vec) {
81; CHECK-LABEL: @test5
82; CHECK: ret <4 x i1> <i1 true, i1 true, i1 true, i1 true>
83 %res = icmp ule <4 x i1> %vec, %vec
84 ret <4 x i1> %res
85}
86
87; Don't crash on vector inputs - pr25040
88define <4 x i1> @test6(<4 x i1> %a, <4 x i1> %b) {
89; CHECK-LABEL: @test6
90; CHECK: ret <4 x i1> %res
91 %res = icmp ule <4 x i1> %a, %b
92 ret <4 x i1> %res
93}
Philip Reamesdbbd7792015-10-29 03:19:10 +000094
Sanjoy Das9349dcc2015-11-06 19:00:57 +000095; i +_{nsw} 1 <s L ==> i < L +_{nsw} 1
96define i1 @test7(i32 %length.i, i32 %i) {
97; CHECK-LABEL: @test7(
98; CHECK: ret i1 true
99 %iplus1 = add nsw i32 %i, 1
100 %len.plus.one = add nsw i32 %length.i, 1
101 %var29 = icmp slt i32 %i, %len.plus.one
102 %var30 = icmp slt i32 %iplus1, %length.i
103 %res = icmp ule i1 %var30, %var29
104 ret i1 %res
105}
106
107; i +_{nuw} 1 <s L ==> i < L +_{nuw} 1
108define i1 @test8(i32 %length.i, i32 %i) {
109; CHECK-LABEL: @test8(
110; CHECK: ret i1 true
111 %iplus1 = add nuw i32 %i, 1
112 %len.plus.one = add nuw i32 %length.i, 1
113 %var29 = icmp ult i32 %i, %len.plus.one
114 %var30 = icmp ult i32 %iplus1, %length.i
115 %res = icmp ule i1 %var30, %var29
116 ret i1 %res
117}
118
Sanjoy Dasc01b4d22015-11-06 19:01:03 +0000119; i +_{nuw} C <s L ==> i < L, even if C is negative
120define i1 @test9(i32 %length.i, i32 %i) {
121; CHECK-LABEL: @test9(
122; CHECK: ret i1 true
123 %iplus1 = add nuw i32 %i, -100
124 %var29 = icmp ult i32 %i, %length.i
125 %var30 = icmp ult i32 %iplus1, %length.i
126 %res = icmp ule i1 %var30, %var29
127 ret i1 %res
128}
129
Philip Reamesdbbd7792015-10-29 03:19:10 +0000130; X >=(s) Y == X ==> Y (i1 1 becomes -1 for reasoning)
131define i1 @test_sge(i32 %length.i, i32 %i) {
132; CHECK-LABEL: @test_sge
133; CHECK: ret i1 true
134 %iplus1 = add nsw nuw i32 %i, 1
135 %var29 = icmp ult i32 %i, %length.i
136 %var30 = icmp ult i32 %iplus1, %length.i
137 %res = icmp sge i1 %var30, %var29
138 ret i1 %res
139}