Some more boolopt tests.
[libfirm] / ir / be / test / boolopts.c
1 /*$ -fno-inline $*/
2 #include <limits.h>
3 #include <stdio.h>
4
5 int f(int a, int b)
6 {
7         return a < 0 & b < 0;
8 }
9
10 int f2(short a, short b)
11 {
12         return a < b && b < a;
13 }
14
15 int f3(short a, short b)
16 {
17         return a < b && b > a;
18 }
19
20 int f4(short a, short b, short c)
21 {
22         return (a <= c) & (b <= c);
23 }
24
25 int g(unsigned a, unsigned b)
26 {
27         return ((a >> 12) | 5) & ((b >> 12) | 5);
28 }
29
30 int g2(unsigned a, unsigned b)
31 {
32         return (a & 5) | (b & 5);
33 }
34
35 int g3(int a, int b, int z)
36 {
37         return (a | z) & (b | z);
38 }
39
40 int imp(int a, int b)
41 {
42         /* logical implication */
43         return (a < b) <= (a <= b);
44 }
45
46 int eq(int a, int b)
47 {
48         return (a < b) == (a <= b);
49 }
50
51 int neq(int a, int b)
52 {
53         return (a < b) != (a <= b);
54 }
55
56 int af(int a)
57 {
58         return (a ? 1 : 0) && !a;
59 }
60
61 int at(int a)
62 {
63         return (a ? 1 : 0) || !a;
64 }
65
66 int c(int a, int b)
67 {
68         return a < b || a == b;
69 }
70
71 int c2(int a, int b)
72 {
73         return a < b && a <= b;
74 }
75
76 int c3(int a, int b)
77 {
78         return a < b || a >= b;
79 }
80
81 int c4(int a, int b)
82 {
83         return a < b ^ a <= b;
84 }
85
86 int main()
87 {
88 #define UOP(func,val,should_be) { printf("%s(%d) -> %d (should be %d)\n", #func, val, func(val), should_be); }
89 #define BOP(func,val1,val2,should_be) { printf("%s(%d,%d) -> %d (should be %d)\n", #func, val1, val2, func(val1,val2), should_be); }
90 #define TOP(func,val1,val2,val3,should_be) { printf("%s(%d,%d,%d) -> %d (should be %d)\n", #func, val1, val2, val3, func(val1,val2,val3), should_be); }
91         BOP(f, 0, 0, 0);
92         BOP(f, -1, 0, 0);
93         BOP(f, 0, -42, 0);
94         BOP(f, -1, 1, 0);
95         BOP(f, -42, -23, 1);
96         BOP(f, 13, -1, 0);
97         BOP(f, -1, -1, 1);
98         BOP(f, INT_MIN, INT_MIN, 1);
99         BOP(f, INT_MIN, -1, 1);
100         BOP(f, -1, INT_MIN, 1);
101
102         BOP(f2, 0, 0, 0);
103         BOP(f2, -1, 0, 0);
104         BOP(f2, 0, -42, 0);
105         BOP(f2, -1, 1, 0);
106         BOP(f2, -42, -23, 0);
107         BOP(f2, 13, -1, 0);
108         BOP(f2, -1, -1, 0);
109         BOP(f2, SHRT_MIN, SHRT_MIN, 0);
110         BOP(f2, SHRT_MIN, -1, 0);
111         BOP(f2, -1, SHRT_MIN, 0);
112
113         BOP(f3, 0, 0, 0);
114         BOP(f3, -1, 0, 1);
115         BOP(f3, 0, -42, 0);
116         BOP(f3, -1, 1, 1);
117         BOP(f3, -42, -23, 1);
118         BOP(f3, 13, -1, 0);
119         BOP(f3, -1, -1, 0);
120         BOP(f3, SHRT_MIN, SHRT_MIN, 0);
121         BOP(f3, SHRT_MIN, -1, 1);
122         BOP(f3, -1, SHRT_MIN, 0);
123
124         TOP(f4, 1, 2, 3, 1);
125         TOP(f4, -1, -2, -3, 0);
126         TOP(f4, SHRT_MIN, SHRT_MIN, -1, 1);
127         TOP(f4, SHRT_MIN, SHRT_MIN, SHRT_MIN, 1);
128         TOP(f4, SHRT_MAX, SHRT_MIN, SHRT_MAX, 1);
129         TOP(f4, SHRT_MIN, SHRT_MIN, SHRT_MAX, 1);
130         TOP(f4, 13, 42, SHRT_MAX, 1);
131         TOP(f4, 0, 0, 0, 1);
132         TOP(f4, 1, 1, 1, 1);
133
134         BOP(g, UINT_MAX, UINT_MAX, 1048575);
135         BOP(g, 0, 0, 5);
136         BOP(g, 12345, 54321, 5);
137
138         BOP(g2, UINT_MAX, UINT_MAX, 5);
139         BOP(g2, 0, 0, 0);
140         BOP(g2, 12345, 54321, 1);
141
142         BOP(imp, UINT_MAX, UINT_MAX, 1);
143         BOP(imp, 0, 0, 1);
144         BOP(imp, 12345, 54321, 1);
145         BOP(imp, 42, 23, 1);
146
147         BOP(eq, UINT_MAX, UINT_MAX, 0);
148         BOP(eq, 0, 0, 0);
149         BOP(eq, 12345, 54321, 1);
150         BOP(eq, 42, 23, 1);
151
152         BOP(neq, UINT_MAX, UINT_MAX, 1);
153         BOP(neq, 0, 0, 1);
154         BOP(neq, 12345, 54321, 0);
155         BOP(neq, 42, 23, 0);
156
157         TOP(g3, 1, 2, 3, 3);
158         TOP(g3, -1, -2, -3, -1);
159         TOP(g3, INT_MIN, INT_MIN, -1, -1);
160         TOP(g3, INT_MIN, INT_MIN, INT_MIN, INT_MIN);
161         TOP(g3, INT_MAX, INT_MIN, INT_MAX, INT_MAX);
162         TOP(g3, INT_MIN, INT_MIN, INT_MAX, -1);
163         TOP(g3, 13, 42, INT_MAX, INT_MAX);
164         TOP(g3, 0, 0, 0, 0);
165         TOP(g3, 1, 1, 1, 1);
166
167         UOP(af, 0, 0);
168         UOP(af, 1, 0);
169         UOP(af, 42, 0);
170         UOP(af, -1, 0);
171
172         UOP(at, 0, 1);
173         UOP(at, 1, 1);
174         UOP(at, 42, 1);
175         UOP(at, -1, 1);
176
177         BOP(c, 0, 0, 0);
178         BOP(c, -1, 0, 0);
179         BOP(c, 0, -42, 0);
180         BOP(c, -1, 1, 0);
181         BOP(c, -42, -23, 0);
182         BOP(c, 13, -1, 0);
183         BOP(c, -1, -1, 0);
184         BOP(c, SHRT_MIN, SHRT_MIN, 0);
185         BOP(c, SHRT_MIN, -1, 0);
186         BOP(c, -1, SHRT_MIN, 0);
187
188         BOP(c2, 0, 0, 0);
189         BOP(c2, -1, 0, 0);
190         BOP(c2, 0, -42, 0);
191         BOP(c2, -1, 1, 0);
192         BOP(c2, -42, -23, 0);
193         BOP(c2, 13, -1, 0);
194         BOP(c2, -1, -1, 0);
195         BOP(c2, SHRT_MIN, SHRT_MIN, 0);
196         BOP(c2, SHRT_MIN, -1, 0);
197         BOP(c2, -1, SHRT_MIN, 0);
198
199         BOP(c3, 0, 0, 0);
200         BOP(c3, -1, 0, 0);
201         BOP(c3, 0, -42, 0);
202         BOP(c3, -1, 1, 0);
203         BOP(c3, -42, -23, 0);
204         BOP(c3, 13, -1, 0);
205         BOP(c3, -1, -1, 0);
206         BOP(c3, SHRT_MIN, SHRT_MIN, 0);
207         BOP(c3, SHRT_MIN, -1, 0);
208         BOP(c3, -1, SHRT_MIN, 0);
209
210         BOP(c4, 0, 0, 0);
211         BOP(c4, -1, 0, 0);
212         BOP(c4, 0, -42, 0);
213         BOP(c4, -1, 1, 0);
214         BOP(c4, -42, -23, 0);
215         BOP(c4, 13, -1, 0);
216         BOP(c4, -1, -1, 0);
217         BOP(c4, SHRT_MIN, SHRT_MIN, 0);
218         BOP(c4, SHRT_MIN, -1, 0);
219         BOP(c4, -1, SHRT_MIN, 0);
220
221         return 0;
222 }