Implement PR3266 & PR5276, folding:
[oota-llvm.git] / test / Transforms / InstCombine / or.ll
1 ; This test makes sure that these instructions are properly eliminated.
2 ;
3 ; RUN: opt < %s -instcombine -S | FileCheck %s
4
5 define i32 @test1(i32 %A) {
6         %B = or i32 %A, 0
7         ret i32 %B
8 ; CHECK: @test1
9 ; CHECK: ret i32 %A
10 }
11
12 define i32 @test2(i32 %A) {
13         %B = or i32 %A, -1 
14         ret i32 %B
15 ; CHECK: @test2
16 ; CHECK: ret i32 -1
17 }
18
19 define i8 @test2a(i8 %A) {
20         %B = or i8 %A, -1  
21         ret i8 %B
22 ; CHECK: @test2a
23 ; CHECK: ret i8 -1
24 }
25
26 define i1 @test3(i1 %A) {
27         %B = or i1 %A, false
28         ret i1 %B
29 ; CHECK: @test3
30 ; CHECK: ret i1 %A
31 }
32
33 define i1 @test4(i1 %A) {
34         %B = or i1 %A, true 
35         ret i1 %B
36 ; CHECK: @test4
37 ; CHECK: ret i1 true
38 }
39
40 define i1 @test5(i1 %A) {
41         %B = or i1 %A, %A   
42         ret i1 %B
43 ; CHECK: @test5
44 ; CHECK: ret i1 %A
45 }
46
47 define i32 @test6(i32 %A) {
48         %B = or i32 %A, %A  
49         ret i32 %B
50 ; CHECK: @test6
51 ; CHECK: ret i32 %A
52 }
53
54 ; A | ~A == -1
55 define i32 @test7(i32 %A) {
56         %NotA = xor i32 -1, %A
57         %B = or i32 %A, %NotA
58         ret i32 %B
59 ; CHECK: @test7
60 ; CHECK: ret i32 -1
61 }
62
63 define i8 @test8(i8 %A) {
64         %B = or i8 %A, -2
65         %C = or i8 %B, 1
66         ret i8 %C
67 ; CHECK: @test8
68 ; CHECK: ret i8 -1
69 }
70
71 ; Test that (A|c1)|(B|c2) == (A|B)|(c1|c2)
72 define i8 @test9(i8 %A, i8 %B) {
73         %C = or i8 %A, 1
74         %D = or i8 %B, -2
75         %E = or i8 %C, %D
76         ret i8 %E
77 ; CHECK: @test9
78 ; CHECK: ret i8 -1
79 }
80
81 define i8 @test10(i8 %A) {
82         %B = or i8 %A, 1
83         %C = and i8 %B, -2
84         ; (X & C1) | C2 --> (X | C2) & (C1|C2)
85         %D = or i8 %C, -2
86         ret i8 %D
87 ; CHECK: @test10
88 ; CHECK: ret i8 -2
89 }
90
91 define i8 @test11(i8 %A) {
92         %B = or i8 %A, -2
93         %C = xor i8 %B, 13
94         ; (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2)
95         %D = or i8 %C, 1
96         %E = xor i8 %D, 12
97         ret i8 %E
98 ; CHECK: @test11
99 ; CHECK: ret i8 -1
100 }
101
102 define i32 @test12(i32 %A) {
103         ; Should be eliminated
104         %B = or i32 %A, 4
105         %C = and i32 %B, 8
106         ret i32 %C
107 ; CHECK: @test12
108 ; CHECK: %C = and i32 %A, 8
109 ; CHECK: ret i32 %C
110 }
111
112 define i32 @test13(i32 %A) {
113         %B = or i32 %A, 12
114         ; Always equal to 8
115         %C = and i32 %B, 8
116         ret i32 %C
117 ; CHECK: @test13
118 ; CHECK: ret i32 8
119 }
120
121 define i1 @test14(i32 %A, i32 %B) {
122         %C1 = icmp ult i32 %A, %B
123         %C2 = icmp ugt i32 %A, %B
124         ; (A < B) | (A > B) === A != B
125         %D = or i1 %C1, %C2
126         ret i1 %D
127 ; CHECK: @test14
128 ; CHECK: %D = icmp ne i32 %A, %B
129 ; CHECK: ret i1 %D
130 }
131
132 define i1 @test15(i32 %A, i32 %B) {
133         %C1 = icmp ult i32 %A, %B
134         %C2 = icmp eq i32 %A, %B
135         ; (A < B) | (A == B) === A <= B
136         %D = or i1 %C1, %C2
137         ret i1 %D
138 ; CHECK: @test15
139 ; CHECK: %D = icmp ule i32 %A, %B
140 ; CHECK: ret i1 %D
141 }
142
143 define i32 @test16(i32 %A) {
144         %B = and i32 %A, 1
145         ; -2 = ~1
146         %C = and i32 %A, -2
147         ; %D = and int %B, -1 == %B
148         %D = or i32 %B, %C
149         ret i32 %D
150 ; CHECK: @test16
151 ; CHECK: ret i32 %A
152 }
153
154 define i32 @test17(i32 %A) {
155         %B = and i32 %A, 1
156         %C = and i32 %A, 4
157         ; %D = and int %B, 5
158         %D = or i32 %B, %C
159         ret i32 %D
160 ; CHECK: @test17
161 ; CHECK: %D = and i32 %A, 5
162 ; CHECK: ret i32 %D
163 }
164
165 define i1 @test18(i32 %A) {
166         %B = icmp sge i32 %A, 100
167         %C = icmp slt i32 %A, 50
168         ;; (A-50) >u 50
169         %D = or i1 %B, %C
170         ret i1 %D
171 ; CHECK: @test18
172 ; CHECK: add i32
173 ; CHECK: %D = icmp ugt 
174 ; CHECK: ret i1 %D
175 }
176
177 define i1 @test19(i32 %A) {
178         %B = icmp eq i32 %A, 50
179         %C = icmp eq i32 %A, 51
180         ;; (A-50) < 2
181         %D = or i1 %B, %C
182         ret i1 %D
183 ; CHECK: @test19
184 ; CHECK: add i32
185 ; CHECK: %D = icmp ult 
186 ; CHECK: ret i1 %D
187 }
188
189 define i32 @test20(i32 %x) {
190         %y = and i32 %x, 123
191         %z = or i32 %y, %x
192         ret i32 %z
193 ; CHECK: @test20
194 ; CHECK: ret i32 %x
195 }
196
197 define i32 @test21(i32 %tmp.1) {
198         %tmp.1.mask1 = add i32 %tmp.1, 2
199         %tmp.3 = and i32 %tmp.1.mask1, -2
200         %tmp.5 = and i32 %tmp.1, 1
201         ;; add tmp.1, 2
202         %tmp.6 = or i32 %tmp.5, %tmp.3
203         ret i32 %tmp.6
204 ; CHECK: @test21
205 ; CHECK:   add i32 %{{[^,]*}}, 2
206 ; CHECK:   ret i32 
207 }
208
209 define i32 @test22(i32 %B) {
210         %ELIM41 = and i32 %B, 1
211         %ELIM7 = and i32 %B, -2
212         %ELIM5 = or i32 %ELIM41, %ELIM7
213         ret i32 %ELIM5
214 ; CHECK: @test22
215 ; CHECK: ret i32 %B
216 }
217
218 define i16 @test23(i16 %A) {
219         %B = lshr i16 %A, 1
220         ;; fold or into xor
221         %C = or i16 %B, -32768
222         %D = xor i16 %C, 8193
223         ret i16 %D
224 ; CHECK: @test23
225 ; CHECK:   %B = lshr i16 %A, 1
226 ; CHECK:   %D = xor i16 %B, -24575
227 ; CHECK:   ret i16 %D
228 }
229
230 ; PR1738
231 define i1 @test24(double %X, double %Y) {
232         %tmp9 = fcmp uno double %X, 0.000000e+00                ; <i1> [#uses=1]
233         %tmp13 = fcmp uno double %Y, 0.000000e+00               ; <i1> [#uses=1]
234         %bothcond = or i1 %tmp13, %tmp9         ; <i1> [#uses=1]
235         ret i1 %bothcond
236         
237 ; CHECK: @test24
238 ; CHECK:   %bothcond = fcmp uno double %Y, %X              ; <i1> [#uses=1]
239 ; CHECK:   ret i1 %bothcond
240 }
241
242 ; PR3266 & PR5276
243 define i1 @test25(i32 %A, i32 %B) {
244   %C = icmp eq i32 %A, 0
245   %D = icmp eq i32 %B, 57
246   %E = or i1 %C, %D
247   %F = xor i1 %E, -1
248   ret i1 %F
249
250 ; CHECK: @test25
251 ; CHECK: icmp ne i32 %A, 0
252 ; CHECK-NEXT: icmp ne i32 %B, 57
253 ; CHECK-NEXT:  %F = and i1 
254 ; CHECK-NEXT:  ret i1 %F
255 }