Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Side by Side Diff: tests/compiler/dart2js/value_range2_test.dart

Issue 11042002: Fix buggy computations in value ranges, spotted by floitsch@. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #import("../../../lib/compiler/implementation/ssa/ssa.dart");
6 #import("../../../lib/compiler/implementation/leg.dart");
7
8 Value instructionValue = new InstructionValue(new HReturn(null));
9 Value lengthValue = new LengthValue(new HReturn(null));
10
11 Range createSingleRange(Value value) => new Range(value, value);
12 Range createSingleIntRange(int value) => createSingleRange(new IntValue(value));
13 Range createSingleInstructionRange() => createSingleRange(instructionValue);
14 Range createSingleLengthRange() => createSingleRange(lengthValue);
15 Range createIntRange(int lower, int upper) {
16 return new Range(new IntValue(lower), new IntValue(upper));
17 }
18 Range createLengthRange(int lower) {
19 return new Range(new IntValue(lower), lengthValue);
20 }
21 Range createInstructionRange(int lower) {
22 return new Range(new IntValue(lower), instructionValue);
23 }
24
25 Range instruction = createSingleInstructionRange();
26 Range FF = createSingleIntRange(0xFF);
27 Range FA = createSingleIntRange(0xFA);
28 Range nFF = createSingleIntRange(-0xFF);
29 Range length = createSingleLengthRange();
30 Range _FA_FF = createIntRange(0xFA, 0xFF);
31 Range _0_FF = createIntRange(0, 0xFF);
32 Range _nFF_FF = createIntRange(-0xFF, 0xFF);
33 Range _nFF_0 = createIntRange(-0xFF, 0);
34 Range _0_length = createLengthRange(0);
35 Range _0_instruction = createInstructionRange(0);
36
37 checkAndRange(Range one, Range two, lower, upper) {
38 if (lower is num) lower = new IntValue(lower);
39 if (upper is num) upper = new IntValue(upper);
40 Range range = new Range(lower, upper);
41 Expect.equals(range, one & two);
42 }
43
44 checkSubRange(Range one, Range two, [lower, upper]) {
45 if (lower == null) {
46 lower = new OperationValue(one.lower, two.upper, const SubtractOperation());
47 } else if (lower is num) {
48 lower = new IntValue(lower);
49 }
50 if (upper == null) {
51 upper = new OperationValue(one.upper, two.lower, const SubtractOperation());
52 } else if (upper is num) {
53 upper = new IntValue(upper);
54 }
55
56 Expect.equals(new Range(lower, upper), one - two);
57 }
58
59 testAnd() {
60 checkAndRange(
61 instruction, instruction, const MinIntValue(), const MaxIntValue());
62 checkAndRange(instruction, FF, 0, 0xFF);
63 checkAndRange(instruction, FA, 0, 0xFA);
64 checkAndRange(instruction, nFF, const MinIntValue(), const MaxIntValue());
65 checkAndRange(instruction, length, 0, length.upper);
66 checkAndRange(instruction, _FA_FF, 0, 0xFF);
67 checkAndRange(instruction, _0_FF, 0, 0xFF);
68 checkAndRange(instruction, _nFF_FF, const MinIntValue(), const MaxIntValue());
69 checkAndRange(instruction, _nFF_0, const MinIntValue(), const MaxIntValue());
70 checkAndRange(instruction, _0_length, 0, _0_length.upper);
71 checkAndRange(instruction, _0_instruction, 0, _0_instruction.upper);
72
73 checkAndRange(length, FF, 0, 0xFF);
74 checkAndRange(length, FA, 0, 0xFA);
75 checkAndRange(length, nFF, 0, length.upper);
76 checkAndRange(length, length, 0, length.upper);
77 checkAndRange(length, _FA_FF, 0, 0xFF);
78 checkAndRange(length, _0_FF, 0, 0xFF);
79 checkAndRange(length, _nFF_FF, 0, length.upper);
80 checkAndRange(length, _nFF_0, 0, length.upper);
81 checkAndRange(length, _0_length, 0, length.upper);
82 checkAndRange(length, _0_instruction, 0, const MaxIntValue());
83
84 checkAndRange(FF, FF, 0xFF, 0xFF);
85 checkAndRange(FF, FA, 0xFA, 0xFA);
86 checkAndRange(FF, nFF, 1, 1);
87 checkAndRange(FF, length, 0, 0xFF);
88 checkAndRange(FF, _FA_FF, 0, 0xFF);
89 checkAndRange(FF, _0_FF, 0, 0xFF);
90 checkAndRange(FF, _nFF_FF, 0, 0xFF);
91 checkAndRange(FF, _nFF_0, 0, 0xFF);
92 checkAndRange(FF, _0_length, 0, 0xFF);
93 checkAndRange(FF, _0_instruction, 0, 0xFF);
94
95 checkAndRange(FA, FF, 0xFA, 0xFA);
96 checkAndRange(FA, FA, 0xFA, 0xFA);
97 checkAndRange(FA, nFF, 0, 0);
98 checkAndRange(FA, length, 0, 0xFA);
99 checkAndRange(FA, _FA_FF, 0, 0xFA);
100 checkAndRange(FA, _0_FF, 0, 0xFA);
101 checkAndRange(FA, _nFF_FF, 0, 0xFA);
102 checkAndRange(FA, _nFF_0, 0, 0xFA);
103 checkAndRange(FA, _0_length, 0, 0xFA);
104 checkAndRange(FA, _0_instruction, 0, 0xFA);
105
106 checkAndRange(nFF, FF, 1, 1);
107 checkAndRange(nFF, FA, 0, 0);
108 checkAndRange(nFF, nFF, -0xFF, -0xFF);
109 checkAndRange(nFF, length, 0, length.upper);
110 checkAndRange(nFF, _FA_FF, 0, 0xFF);
111 checkAndRange(nFF, _0_FF, 0, 0xFF);
112 checkAndRange(nFF, _nFF_FF, const MinIntValue(), const MaxIntValue());
113 checkAndRange(nFF, _nFF_0, const MinIntValue(), const MaxIntValue());
114 checkAndRange(nFF, _0_length, 0, _0_length.upper);
115 checkAndRange(nFF, _0_instruction, 0, _0_instruction.upper);
116
117 checkAndRange(_FA_FF, FF, 0, 0xFF);
118 checkAndRange(_FA_FF, FA, 0, 0xFA);
119 checkAndRange(_FA_FF, nFF, 0, 0xFF);
120 checkAndRange(_FA_FF, length, 0, 0xFF);
121 checkAndRange(_FA_FF, _FA_FF, 0, 0xFF);
122 checkAndRange(_FA_FF, _0_FF, 0, 0xFF);
123 checkAndRange(_FA_FF, _nFF_FF, 0, 0xFF);
124 checkAndRange(_FA_FF, _nFF_0, 0, 0xFF);
125 checkAndRange(_FA_FF, _0_length, 0, 0xFF);
126 checkAndRange(_FA_FF, _0_instruction, 0, 0xFF);
127
128 checkAndRange(_0_FF, FF, 0, 0xFF);
129 checkAndRange(_0_FF, FA, 0, 0xFA);
130 checkAndRange(_0_FF, nFF, 0, 0xFF);
131 checkAndRange(_0_FF, length, 0, 0xFF);
132 checkAndRange(_0_FF, _FA_FF, 0, 0xFF);
133 checkAndRange(_0_FF, _0_FF, 0, 0xFF);
134 checkAndRange(_0_FF, _nFF_FF, 0, 0xFF);
135 checkAndRange(_0_FF, _nFF_0, 0, 0xFF);
136 checkAndRange(_0_FF, _0_length, 0, 0xFF);
137 checkAndRange(_0_FF, _0_instruction, 0, 0xFF);
138
139 checkAndRange(_nFF_FF, FF, 0, 0xFF);
140 checkAndRange(_nFF_FF, FA, 0, 0xFA);
141 checkAndRange(_nFF_FF, nFF, const MinIntValue(), const MaxIntValue());
142 checkAndRange(_nFF_FF, length, 0, length.upper);
143 checkAndRange(_nFF_FF, _FA_FF, 0, 0xFF);
144 checkAndRange(_nFF_FF, _0_FF, 0, 0xFF);
145 checkAndRange(_nFF_FF, _nFF_FF, const MinIntValue(), const MaxIntValue());
146 checkAndRange(_nFF_FF, _nFF_0, const MinIntValue(), const MaxIntValue());
147 checkAndRange(_nFF_FF, _0_length, 0, _0_length.upper);
148 checkAndRange(_nFF_FF, _0_instruction, 0, _0_instruction.upper);
149
150 checkAndRange(_nFF_0, FF, 0, 0xFF);
151 checkAndRange(_nFF_0, FA, 0, 0xFA);
152 checkAndRange(_nFF_0, nFF, const MinIntValue(), const MaxIntValue());
153 checkAndRange(_nFF_0, length, 0, length.upper);
154 checkAndRange(_nFF_0, _FA_FF, 0, 0xFF);
155 checkAndRange(_nFF_0, _0_FF, 0, 0xFF);
156 checkAndRange(_nFF_0, _nFF_FF, const MinIntValue(), const MaxIntValue());
157 checkAndRange(_nFF_0, _nFF_0, const MinIntValue(), const MaxIntValue());
158 checkAndRange(_nFF_0, _0_length, 0, _0_length.upper);
159 checkAndRange(_nFF_0, _0_instruction, 0, _0_instruction.upper);
160
161 checkAndRange(_0_length, FF, 0, 0xFF);
162 checkAndRange(_0_length, FA, 0, 0xFA);
163 checkAndRange(_0_length, nFF, 0, _0_length.upper);
164 checkAndRange(_0_length, length, 0, length.upper);
165 checkAndRange(_0_length, _FA_FF, 0, 0xFF);
166 checkAndRange(_0_length, _0_FF, 0, 0xFF);
167 checkAndRange(_0_length, _nFF_FF, 0, _0_length.upper);
168 checkAndRange(_0_length, _nFF_0, 0, _0_length.upper);
169 checkAndRange(_0_length, _0_length, 0, _0_length.upper);
170 checkAndRange(_0_length, _0_instruction, 0, const MaxIntValue());
171
172 checkAndRange(_0_instruction, FF, 0, 0xFF);
173 checkAndRange(_0_instruction, FA, 0, 0xFA);
174 checkAndRange(_0_instruction, nFF, 0, _0_instruction.upper);
175 checkAndRange(_0_instruction, length, 0, const MaxIntValue());
176 checkAndRange(_0_instruction, _FA_FF, 0, 0xFF);
177 checkAndRange(_0_instruction, _0_FF, 0, 0xFF);
178 checkAndRange(_0_instruction, _nFF_FF, 0, _0_instruction.upper);
179 checkAndRange(_0_instruction, _nFF_0, 0, _0_instruction.upper);
180 checkAndRange(_0_instruction, _0_length, 0, const MaxIntValue());
181 checkAndRange(_0_instruction, _0_instruction, 0, _0_instruction.upper);
182 }
183
184 testSub() {
185 checkSubRange(instruction, instruction, 0, 0);
186 checkSubRange(instruction, FF);
187 checkSubRange(instruction, FA);
188 checkSubRange(instruction, nFF);
189 checkSubRange(instruction, length);
190 checkSubRange(instruction, _FA_FF);
191 checkSubRange(instruction, _0_FF, null, instruction.upper);
192 checkSubRange(instruction, _nFF_FF);
193 checkSubRange(instruction, _nFF_0, instruction.lower, null);
194 checkSubRange(instruction, _0_length, null, instruction.upper);
195 checkSubRange(instruction, _0_instruction, 0, _0_instruction.upper);
196
197 checkSubRange(length, FF);
198 checkSubRange(length, FA);
199 checkSubRange(length, nFF);
200 checkSubRange(length, length, 0, 0);
201 checkSubRange(length, _FA_FF);
202 checkSubRange(length, _0_FF, null, length.upper);
203 checkSubRange(length, _nFF_FF);
204 checkSubRange(length, _nFF_0, length.lower, null);
205 checkSubRange(length, _0_length, 0, length.upper);
206 checkSubRange(length, _0_instruction, null, length.upper);
207
208 checkSubRange(FF, FF, 0, 0);
209 checkSubRange(FF, FA, 0xFF - 0xFA, 0xFF - 0xFA);
210 checkSubRange(FF, nFF, 0xFF + 0xFF, 0xFF + 0xFF);
211 checkSubRange(FF, length);
212 checkSubRange(FF, _FA_FF, 0, 0xFF - 0xFA);
213 checkSubRange(FF, _0_FF, 0, 0xFF);
214 checkSubRange(FF, _nFF_FF, 0, 0xFF + 0xFF);
215 checkSubRange(FF, _nFF_0, 0xFF, 0xFF + 0xFF);
216 checkSubRange(FF, _0_length, null, 0xFF);
217 checkSubRange(FF, _0_instruction, null, 0xFF);
218
219 checkSubRange(FA, FF, 0xFA - 0xFF, 0xFA - 0xFF);
220 checkSubRange(FA, FA, 0, 0);
221 checkSubRange(FA, nFF, 0xFA + 0xFF, 0xFA + 0xFF);
222 checkSubRange(FA, length);
223 checkSubRange(FA, _FA_FF, 0xFA - 0xFF, 0);
224 checkSubRange(FA, _0_FF, 0xFA - 0xFF, 0xFA);
225 checkSubRange(FA, _nFF_FF, 0xFA - 0xFF, 0xFA + 0xFF);
226 checkSubRange(FA, _nFF_0, 0xFA, 0xFA + 0xFF);
227 checkSubRange(FA, _0_length, null, 0xFA);
228 checkSubRange(FA, _0_instruction, null, 0xFA);
229
230 checkSubRange(nFF, FF, -0xFF - 0xFF, -0xFF - 0xFF);
231 checkSubRange(nFF, FA, -0xFF - 0xFA, -0xFF - 0xFA);
232 checkSubRange(nFF, nFF, 0, 0);
233 checkSubRange(nFF, length);
234 checkSubRange(nFF, _FA_FF, -0xFF - 0xFF, -0xFF - 0xFA);
235 checkSubRange(nFF, _0_FF, -0xFF - 0xFF, -0xFF);
236 checkSubRange(nFF, _nFF_FF, -0xFF - 0xFF, 0);
237 checkSubRange(nFF, _nFF_0, -0xFF, 0);
238 checkSubRange(nFF, _0_length, null, -0xFF);
239 checkSubRange(nFF, _0_instruction, null, -0xFF);
240
241 checkSubRange(_FA_FF, FF, 0xFA - 0xFF, 0);
242 checkSubRange(_FA_FF, FA, 0, 0xFF - 0xFA);
243 checkSubRange(_FA_FF, nFF, 0xFA + 0xFF, 0xFF + 0xFF);
244 checkSubRange(_FA_FF, length);
245 checkSubRange(_FA_FF, _FA_FF, 0xFA - 0xFF, 0xFF - 0xFA);
246 checkSubRange(_FA_FF, _0_FF, 0xFA - 0xFF, 0xFF);
247 checkSubRange(_FA_FF, _nFF_FF, 0xFA - 0xFF, 0xFF + 0xFF);
248 checkSubRange(_FA_FF, _nFF_0, 0xFA, 0xFF + 0xFF);
249 checkSubRange(_FA_FF, _0_length, null, 0xFF);
250 checkSubRange(_FA_FF, _0_instruction, null, 0xFF);
251
252 checkSubRange(_0_FF, FF, -0xFF, 0);
253 checkSubRange(_0_FF, FA, -0xFA, 0xFF - 0xFA);
254 checkSubRange(_0_FF, nFF, 0xFF, 0xFF + 0xFF);
255 checkSubRange(_0_FF, length);
256 checkSubRange(_0_FF, _FA_FF, -0xFF, 0xFF - 0xFA);
257 checkSubRange(_0_FF, _0_FF, -0xFF, 0xFF);
258 checkSubRange(_0_FF, _nFF_FF, -0xFF, 0xFF + 0xFF);
259 checkSubRange(_0_FF, _nFF_0, 0, 0xFF + 0xFF);
260 checkSubRange(_0_FF, _0_length, null, 0xFF);
261 checkSubRange(_0_FF, _0_instruction, null, 0xFF);
262
263 checkSubRange(_nFF_FF, FF, -0xFF - 0xFF, 0);
264 checkSubRange(_nFF_FF, FA, -0xFF - 0xFA, 0xFF - 0xFA);
265 checkSubRange(_nFF_FF, nFF, 0, 0xFF + 0xFF);
266 checkSubRange(_nFF_FF, length);
267 checkSubRange(_nFF_FF, _FA_FF, -0xFF - 0xFF, 0xFF - 0xFA);
268 checkSubRange(_nFF_FF, _0_FF, -0xFF - 0xFF, 0xFF);
269 checkSubRange(_nFF_FF, _nFF_FF, -0xFF - 0xFF, 0xFF + 0xFF);
270 checkSubRange(_nFF_FF, _nFF_0, -0xFF, 0xFF + 0xFF);
271 checkSubRange(_nFF_FF, _0_length, null, 0xFF);
272 checkSubRange(_nFF_FF, _0_instruction, null, 0xFF);
273
274 checkSubRange(_nFF_0, FF, -0xFF - 0xFF, -0xFF);
275 checkSubRange(_nFF_0, FA, -0xFF - 0xFA, -0xFA);
276 checkSubRange(_nFF_0, nFF, 0, 0xFF);
277 checkSubRange(_nFF_0, length);
278 checkSubRange(_nFF_0, _FA_FF, -0xFF - 0xFF, -0xFA);
279 checkSubRange(_nFF_0, _0_FF, -0xFF - 0xFF, 0);
280 checkSubRange(_nFF_0, _nFF_FF, -0xFF - 0xFF, 0xFF);
281 checkSubRange(_nFF_0, _nFF_0, -0xFF, 0xFF);
282 checkSubRange(_nFF_0, _0_length, null, 0);
283 checkSubRange(_nFF_0, _0_instruction, null, 0);
284
285 checkSubRange(_0_length, FF, -0xFF, null);
286 checkSubRange(_0_length, FA, -0xFA, null);
287 checkSubRange(_0_length, nFF, 0xFF, null);
288 checkSubRange(_0_length, length, null, 0);
289 checkSubRange(_0_length, _FA_FF, -0xFF, null);
290 checkSubRange(_0_length, _0_FF, -0xFF, _0_length.upper);
291 checkSubRange(_0_length, _nFF_FF, -0xFF, null);
292 checkSubRange(_0_length, _nFF_0, 0, null);
293 checkSubRange(_0_length, _0_length, null, _0_length.upper);
294 checkSubRange(_0_length, _0_instruction, null, _0_length.upper);
295
296 checkSubRange(_0_instruction, FF, -0xFF, null);
297 checkSubRange(_0_instruction, FA, -0xFA, null);
298 checkSubRange(_0_instruction, nFF, 0xFF, null);
299 checkSubRange(_0_instruction, length);
300 checkSubRange(_0_instruction, _FA_FF, -0xFF, null);
301 checkSubRange(_0_instruction, _0_FF, -0xFF, _0_instruction.upper);
302 checkSubRange(_0_instruction, _nFF_FF, -0xFF, null);
303 checkSubRange(_0_instruction, _nFF_0, 0, null);
304 checkSubRange(_0_instruction, _0_length, null, _0_instruction.upper);
305 checkSubRange(_0_instruction, _0_instruction, null, _0_instruction.upper);
306 }
307
308 main() {
309 HInstruction.idCounter = 0;
310 testAnd();
311 testSub();
312 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698