blob: f392d3a5e7c5bfe7e16ba77eadd5b3a0938a9dc9 [file] [log] [blame]
Duncan Sands9d32f602011-01-20 13:21:55 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2target datalayout = "p:32:32"
3
4define i1 @ptrtoint() {
5; CHECK: @ptrtoint
6 %a = alloca i8
7 %tmp = ptrtoint i8* %a to i32
8 %r = icmp eq i32 %tmp, 0
9 ret i1 %r
10; CHECK: ret i1 false
11}
12
13define i1 @zext(i32 %x) {
14; CHECK: @zext
15 %e1 = zext i32 %x to i64
16 %e2 = zext i32 %x to i64
17 %r = icmp eq i64 %e1, %e2
18 ret i1 %r
19; CHECK: ret i1 true
20}
21
22define i1 @zext2(i1 %x) {
23; CHECK: @zext2
24 %e = zext i1 %x to i32
25 %c = icmp ne i32 %e, 0
26 ret i1 %c
27; CHECK: ret i1 %x
28}
29
Duncan Sandsd70d1a52011-01-25 09:38:29 +000030define i1 @zext3() {
31; CHECK: @zext3
32 %e = zext i1 1 to i32
33 %c = icmp ne i32 %e, 0
34 ret i1 %c
35; CHECK: ret i1 true
36}
37
Duncan Sands9d32f602011-01-20 13:21:55 +000038define i1 @sext(i32 %x) {
39; CHECK: @sext
40 %e1 = sext i32 %x to i64
41 %e2 = sext i32 %x to i64
42 %r = icmp eq i64 %e1, %e2
43 ret i1 %r
44; CHECK: ret i1 true
45}
46
47define i1 @sext2(i1 %x) {
48; CHECK: @sext2
49 %e = sext i1 %x to i32
50 %c = icmp ne i32 %e, 0
51 ret i1 %c
52; CHECK: ret i1 %x
53}
Duncan Sandsd70d1a52011-01-25 09:38:29 +000054
55define i1 @sext3() {
56; CHECK: @sext3
57 %e = sext i1 1 to i32
58 %c = icmp ne i32 %e, 0
59 ret i1 %c
60; CHECK: ret i1 true
61}
62
63define i1 @add(i32 %x, i32 %y) {
Duncan Sands227fba12011-01-25 15:14:15 +000064; CHECK: @add
Duncan Sandsd70d1a52011-01-25 09:38:29 +000065 %l = lshr i32 %x, 1
Duncan Sands227fba12011-01-25 15:14:15 +000066 %q = lshr i32 %y, 1
67 %r = or i32 %q, 1
Duncan Sandsd70d1a52011-01-25 09:38:29 +000068 %s = add i32 %l, %r
69 %c = icmp eq i32 %s, 0
70 ret i1 %c
Duncan Sands227fba12011-01-25 15:14:15 +000071; CHECK: ret i1 false
Duncan Sandsd70d1a52011-01-25 09:38:29 +000072}
73
74define i1 @add2(i8 %x, i8 %y) {
75; CHECK: @add2
76 %l = or i8 %x, 128
77 %r = or i8 %y, 129
78 %s = add i8 %l, %r
79 %c = icmp eq i8 %s, 0
80 ret i1 %c
81; CHECK: ret i1 false
82}
83
Duncan Sands227fba12011-01-25 15:14:15 +000084define i1 @add3(i8 %x, i8 %y) {
85; CHECK: @add3
86 %l = zext i8 %x to i32
87 %r = zext i8 %y to i32
88 %s = add i32 %l, %r
89 %c = icmp eq i32 %s, 0
90 ret i1 %c
91; CHECK: ret i1 %c
92}
93
Duncan Sands52fb8462011-02-13 17:15:40 +000094define i1 @add4(i32 %x, i32 %y) {
95; CHECK: @add4
96 %z = add nsw i32 %y, 1
97 %s1 = add nsw i32 %x, %y
98 %s2 = add nsw i32 %x, %z
99 %c = icmp slt i32 %s1, %s2
100 ret i1 %c
101; CHECK: ret i1 true
102}
103
104define i1 @add5(i32 %x, i32 %y) {
105; CHECK: @add5
106 %z = add nuw i32 %y, 1
107 %s1 = add nuw i32 %x, %z
108 %s2 = add nuw i32 %x, %y
109 %c = icmp ugt i32 %s1, %s2
110 ret i1 %c
111; CHECK: ret i1 true
112}
113
Duncan Sandsd70d1a52011-01-25 09:38:29 +0000114define i1 @addpowtwo(i32 %x, i32 %y) {
115; CHECK: @addpowtwo
116 %l = lshr i32 %x, 1
117 %r = shl i32 1, %y
118 %s = add i32 %l, %r
119 %c = icmp eq i32 %s, 0
120 ret i1 %c
121; CHECK: ret i1 false
122}
123
124define i1 @or(i32 %x) {
125; CHECK: @or
126 %o = or i32 %x, 1
127 %c = icmp eq i32 %o, 0
128 ret i1 %c
129; CHECK: ret i1 false
130}
Duncan Sands91367822011-01-29 13:27:00 +0000131
132define i1 @shl(i32 %x) {
133; CHECK: @shl
134 %s = shl i32 1, %x
135 %c = icmp eq i32 %s, 0
136 ret i1 %c
137; CHECK: ret i1 false
138}
139
140define i1 @lshr(i32 %x) {
141; CHECK: @lshr
142 %s = lshr i32 -1, %x
143 %c = icmp eq i32 %s, 0
144 ret i1 %c
145; CHECK: ret i1 false
146}
147
148define i1 @ashr(i32 %x) {
149; CHECK: @ashr
150 %s = ashr i32 -1, %x
151 %c = icmp eq i32 %s, 0
152 ret i1 %c
153; CHECK: ret i1 false
154}
Duncan Sands50ca4d32011-02-03 09:37:39 +0000155
156define i1 @select1(i1 %cond) {
157; CHECK: @select1
158 %s = select i1 %cond, i32 1, i32 0
159 %c = icmp eq i32 %s, 1
160 ret i1 %c
161; CHECK: ret i1 %cond
162}
163
164define i1 @select2(i1 %cond) {
165; CHECK: @select2
166 %x = zext i1 %cond to i32
167 %s = select i1 %cond, i32 %x, i32 0
168 %c = icmp ne i32 %s, 0
169 ret i1 %c
170; CHECK: ret i1 %cond
171}
172
173define i1 @select3(i1 %cond) {
174; CHECK: @select3
175 %x = zext i1 %cond to i32
176 %s = select i1 %cond, i32 1, i32 %x
177 %c = icmp ne i32 %s, 0
178 ret i1 %c
179; CHECK: ret i1 %cond
180}
181
182define i1 @select4(i1 %cond) {
183; CHECK: @select4
184 %invert = xor i1 %cond, 1
185 %s = select i1 %invert, i32 0, i32 1
186 %c = icmp ne i32 %s, 0
187 ret i1 %c
188; CHECK: ret i1 %cond
189}
Nick Lewycky88cd0aa2011-03-01 08:15:50 +0000190
191define i1 @urem1(i32 %X, i32 %Y) {
192; CHECK: @urem1
193 %A = urem i32 %X, %Y
194 %B = icmp ult i32 %A, %Y
195 ret i1 %B
196; CHECK: ret i1 true
197}
198
199define i1 @urem2(i32 %X, i32 %Y) {
200; CHECK: @urem2
201 %A = urem i32 %X, %Y
202 %B = icmp eq i32 %A, %Y
203 ret i1 %B
204; CHECK ret i1 false
205}