1 USING: accessors arrays assocs compiler.cfg.instructions compiler.cfg.registers
2 compiler.cfg.stacks.padding compiler.cfg.utilities compiler.test kernel
3 sequences sorting vectors tools.test ;
4 IN: compiler.cfg.stacks.padding.tests
6 ! classify-read: initialized locations
8 { 3 { } } 2 classify-read
9 ! Negative locations aren't tracked really.
10 { 0 { } } -1 classify-read
11 { 3 { } } -1 classify-read
14 ! classify-read: over locations
16 { 1 { 0 } } 1 classify-read
17 { 0 { } } 0 classify-read
18 { 3 { } } 4 classify-read
19 { 0 { } } 4 classify-read
20 { 1 { 0 } } 4 classify-read
23 ! classify-read: vacant locations
25 { 1 { 0 } } 0 classify-read
26 { 2 { 0 1 2 } } 0 classify-read
27 { 0 { 0 1 2 } } 0 classify-read
32 { { 0 { } } { 2 { } } }
33 { { 0 { } } { 2 { } } }
35 { { 0 { } } { 2 { } } } all-live
36 { { 0 { } } { 2 { 0 } } } all-live
41 { { 4 { } } { 2 { 0 1 } } }
43 V{ { { 4 { } } { 2 { 0 1 } } } } combine-states
47 { { 2 { 0 1 } } { 2 { 0 1 } } }
50 { { 2 { 0 1 } } { 2 { } } }
51 { { 2 { } } { 2 { 0 1 } } }
56 { { 0 { } } { 0 { } } }
63 ! We assume that overinitialized locations are always dead.
65 { { 0 { } } { 0 { } } }
67 { { 3 { 0 } } { 0 { } } } T{ ##inc { loc D: -3 } } visit-insn
71 { { 3 { 0 1 2 } } { 0 { } } }
73 { { 0 { } } { 0 { } } } T{ ##inc { loc D: 3 } } visit-insn
78 { { 0 { } } { 0 { } } }
80 initial-state T{ ##call } visit-insn
83 ! if any of the stack locations are uninitialized when ##call is
84 ! visisted then something is wrong. ##call might gc and the
85 ! uninitialized locations would cause a crash.
87 { { 3 { 0 1 2 } } { 0 { } } } T{ ##call } visit-insn
88 ] [ vacant-when-calling? ] must-fail-with
90 ! visit-insn ##call-gc
92 ! ##call-gc ofcourse fills all uninitialized locations. ##peek still
93 ! shouldn't look at them, but if we gc again we don't need to exept ##them.
95 { { 4 { } } { 0 { } } }
97 { { 4 { 0 1 2 3 } } { 0 { } } } T{ ##call-gc } visit-insn
102 { { 3 { 0 } } { 0 { } } }
104 { { 3 { 0 } } { 0 { } } } T{ ##peek { dst 1 } { loc D: 1 } } visit-insn
107 ! After a ##peek that can cause a stack underflow, it is certain that
108 ! all stack locations are initialized.
110 { { 0 { } } { 2 { } } }
111 { { 2 { } } { 0 { } } }
113 { { 0 { } } { 2 { 0 1 } } } T{ ##peek { dst 1 } { loc R: 2 } } visit-insn
114 { { 2 { 0 1 } } { 0 { } } } T{ ##peek { dst 1 } { loc D: 2 } } visit-insn
117 ! If the ##peek can't cause a stack underflow, then we don't have the
120 { { 3 { 0 1 2 } } { 0 { } } } T{ ##peek { dst 1 } { loc D: 0 } } visit-insn
121 ] [ vacant-peek? ] must-fail-with
123 : following-stack-state ( insns -- state )
124 T{ ##branch } suffix insns>cfg trace-stack-state
125 >alist [ first ] sort-with last second ;
132 { { 0 { } } { 0 { } } }
136 { { 2 { 0 1 } } { 0 { } } }
140 { { 2 { } } { 0 { } } }
148 } insns>cfg trace-stack-state
153 { 0 { { 0 { } } { 0 { } } } }
154 { 1 { { 0 { } } { 0 { } } } }
155 { 2 { { 0 { } } { 0 { } } } }
158 V{ T{ ##safepoint } T{ ##prologue } T{ ##branch } }
159 insns>cfg trace-stack-state
162 ! The peek "causes" the vacant locations to become populated.
165 { 0 { { 0 { } } { 0 { } } } }
166 { 1 { { 3 { 0 1 2 } } { 0 { } } } }
167 { 2 { { 3 { } } { 0 { } } } }
172 T{ ##peek { loc D: 3 } }
175 insns>cfg trace-stack-state
181 T{ ##replace { src 10 } { loc D: 0 } }
184 T{ ##peek { dst 37 } { loc D: 0 } }
187 1vector >>successors block>cfg ;
191 { 0 { { 0 { } } { 0 { } } } }
192 { 1 { { 1 { 0 } } { 0 { } } } }
193 { 2 { { 1 { } } { 0 { } } } }
194 { 3 { { 1 { } } { 0 { } } } }
196 } [ cfg1 trace-stack-state ] unit-test
198 ! Same cfg structure as the bug1021:run-test word but with
199 ! non-datastack instructions mostly omitted.
200 : bug1021-cfg ( -- cfg )
202 { 0 V{ T{ ##safepoint } T{ ##prologue } T{ ##branch } } }
206 T{ ##replace { src 0 } { loc D: 1 } }
207 T{ ##replace { src 0 } { loc D: 0 } }
212 T{ ##call { word <array> } }
217 T{ ##peek { dst 0 } { loc D: 0 } }
218 T{ ##peek { dst 0 } { loc D: 1 } }
220 T{ ##replace { src 0 } { loc D: 2 } }
221 T{ ##replace { src 0 } { loc D: 3 } }
222 T{ ##replace { src 0 } { loc D: 1 } }
227 T{ ##peek { dst 0 } { loc D: 2 } }
228 T{ ##peek { dst 0 } { loc D: 1 } }
230 T{ ##replace { src 0 } { loc D: 0 } }
231 T{ ##replace { src 0 } { loc D: 1 } }
232 T{ ##replace { src 0 } { loc D: 2 } }
233 T{ ##replace { src 0 } { loc D: 3 } }
239 T{ ##peek { dst 0 } { loc D: 0 } }
240 T{ ##alien-invoke { gc-map T{ gc-map } } }
243 } [ over insns>block ] assoc-map dup
244 { { 0 1 } { 1 2 } { 2 3 } { 3 8 } { 8 10 } } make-edges 0 of block>cfg ;
248 { 0 { { 0 { } } { 0 { } } } }
249 { 1 { { 0 { } } { 0 { } } } }
250 { 2 { { 0 { } } { 0 { } } } }
251 { 3 { { 0 { } } { 0 { } } } }
252 { 4 { { 2 { 0 1 } } { 0 { } } } }
253 { 5 { { 2 { 0 } } { 0 { } } } }
254 { 6 { { 2 { } } { 0 { } } } }
255 { 7 { { 2 { } } { 0 { } } } }
256 { 8 { { 2 { } } { 0 { } } } }
257 { 9 { { 2 { } } { 0 { } } } }
258 { 10 { { 4 { 0 1 } } { 0 { } } } }
259 { 11 { { 4 { 0 1 } } { 0 { } } } }
260 { 12 { { 4 { 0 1 } } { 0 { } } } }
261 { 13 { { 4 { 0 } } { 0 { } } } }
262 { 14 { { 4 { 0 } } { 0 { } } } }
263 { 15 { { 4 { 0 } } { 0 { } } } }
264 { 16 { { 7 { 3 0 1 2 } } { 0 { } } } }
265 { 17 { { 7 { 3 1 2 } } { 0 { } } } }
266 { 18 { { 7 { 3 2 } } { 0 { } } } }
267 { 19 { { 7 { 3 } } { 0 { } } } }
268 { 20 { { 7 { } } { 0 { } } } }
269 { 21 { { 4 { } } { 0 { } } } }
270 ! gc-map here with nothing to scrub
271 { 22 { { 4 { } } { 0 { } } } }
274 bug1021-cfg trace-stack-state
277 ! Same cfg structure as the bug1289:run-test word but with
278 ! non-datastack instructions mostly omitted.
279 : bug1289-cfg ( -- cfg )
285 T{ ##replace { src 0 } { loc D: 2 } }
286 T{ ##replace { src 0 } { loc D: 0 } }
287 T{ ##replace { src 0 } { loc D: 1 } }
292 T{ ##call { word <array> } }
297 T{ ##peek { dst 0 } { loc D: 1 } }
298 T{ ##peek { dst 0 } { loc D: 0 } }
301 T{ ##replace { src 0 } { loc R: 0 } }
311 T{ ##replace { src 0 } { loc R: 3 } }
312 T{ ##replace { src 0 } { loc D: 0 } }
313 T{ ##replace { src 0 } { loc R: 4 } }
314 T{ ##replace { src 0 } { loc R: 2 } }
315 T{ ##replace { src 0 } { loc R: 1 } }
316 T{ ##replace { src 0 } { loc R: 0 } }
321 T{ ##call { word f } }
326 T{ ##peek { dst 0 } { loc D: 0 } }
327 T{ ##peek { dst 0 } { loc R: 3 } }
328 T{ ##peek { dst 0 } { loc R: 2 } }
329 T{ ##peek { dst 0 } { loc R: 1 } }
330 T{ ##peek { dst 0 } { loc R: 0 } }
331 T{ ##peek { dst 0 } { loc R: 4 } }
346 T{ ##peek { dst 0 } { loc R: 0 } }
350 T{ ##replace { src 0 } { loc D: 0 } }
356 } [ over insns>block ] assoc-map dup
373 } make-edges 0 of block>cfg ;
377 { 0 { { 0 { } } { 0 { } } } }
378 { 1 { { 3 { 0 1 2 } } { 0 { } } } }
379 { 2 { { 3 { 0 1 } } { 0 { } } } }
380 { 3 { { 3 { 1 } } { 0 { } } } }
381 { 4 { { 3 { } } { 0 { } } } }
382 { 5 { { 3 { } } { 0 { } } } }
383 { 6 { { 3 { } } { 0 { } } } }
384 { 7 { { 3 { } } { 0 { } } } }
385 { 8 { { 4 { 0 } } { 0 { } } } }
386 { 9 { { 4 { 0 } } { 1 { 0 } } } }
387 { 10 { { 4 { 0 1 } } { 1 { } } } }
388 { 11 { { 2 { } } { 1 { } } } }
389 { 12 { { 2 { } } { 6 { 0 1 2 3 4 } } } }
390 { 13 { { 2 { } } { 6 { 0 1 2 4 } } } }
391 { 14 { { 2 { } } { 6 { 0 1 2 4 } } } }
392 { 15 { { 2 { } } { 6 { 0 1 2 } } } }
393 { 16 { { 2 { } } { 6 { 0 1 } } } }
394 { 17 { { 2 { } } { 6 { 0 } } } }
395 { 18 { { 2 { } } { 6 { } } } }
396 { 19 { { 2 { } } { 6 { } } } }
397 { 20 { { 2 { } } { 6 { } } } }
398 { 21 { { 2 { } } { 6 { } } } }
399 { 22 { { 2 { } } { 6 { } } } }
400 { 23 { { 2 { } } { 6 { } } } }
401 { 24 { { 2 { } } { 6 { } } } }
402 { 25 { { 2 { } } { 6 { } } } }
403 { 26 { { 4 { 0 1 } } { 6 { } } } }
404 { 27 { { 4 { 0 1 } } { 1 { } } } }
405 ! gc-map here scrubbing D: 0 and D: 1
406 { 28 { { 4 { 0 1 } } { 1 { } } } }
407 { 29 { { 4 { 0 1 } } { 1 { } } } }
408 { 30 { { 1 { } } { 1 { } } } }
409 { 31 { { 2 { 0 } } { 1 { } } } }
410 { 32 { { 2 { 0 } } { 0 { } } } }
412 } [ bug1289-cfg trace-stack-state ] unit-test
414 : bug-benchmark-terrain-cfg ( -- cfg )
419 T{ ##peek { loc D: 0 } }
420 T{ ##peek { loc D: 1 } }
421 T{ ##inc { loc D: -1 } }
426 T{ ##inc { loc D: -1 } }
427 T{ ##replace { loc D: 1 } }
428 T{ ##replace { loc D: 0 } }
429 T{ ##inc { loc D: 1 } }
430 T{ ##replace { loc D: 0 } }
433 { 3 V{ T{ ##call } } }
435 { 5 V{ T{ ##call } } }
436 { 6 V{ T{ ##peek { loc D: 0 } } } }
440 T{ ##replace { loc D: 2 } }
441 T{ ##replace { loc D: 1 } }
442 T{ ##replace { loc D: 0 } }
445 { 9 V{ T{ ##call } } }
448 T{ ##inc { loc D: 1 } }
449 T{ ##replace { loc D: 0 } }
452 { 11 V{ T{ ##call } } }
454 { 13 V{ T{ ##call } } }
455 { 14 V{ T{ ##peek { loc D: 0 } } } }
459 T{ ##inc { loc D: 1 } }
460 T{ ##replace { loc D: 0 } }
463 { 17 V{ T{ ##call } } }
466 T{ ##peek { loc D: 2 } }
467 T{ ##peek { loc D: 1 } }
468 T{ ##peek { loc D: 0 } }
469 T{ ##inc { loc D: 1 } }
476 T{ ##inc { loc D: -3 } }
477 T{ ##replace { loc D: 0 } }
480 { 22 V{ T{ ##call } } }
482 { 24 V{ T{ ##call } } }
485 T{ ##peek { loc D: 0 } }
486 T{ ##inc { loc D: 3 } }
493 { 30 V{ T{ ##call-gc } } }
497 T{ ##inc { loc D: -4 } }
498 T{ ##inc { loc D: 1 } }
499 T{ ##replace { loc D: 0 } }
503 } [ over insns>block ] assoc-map dup
537 } make-edges 0 of block>cfg ;
541 { 0 { { 0 { } } { 0 { } } } }
542 { 1 { { 0 { } } { 0 { } } } }
543 { 2 { { 0 { } } { 0 { } } } }
544 { 3 { { -1 { } } { 0 { } } } }
545 { 4 { { -1 { } } { 0 { } } } }
546 { 5 { { -1 { } } { 0 { } } } }
547 { 6 { { -1 { } } { 0 { } } } }
548 { 7 { { -1 { } } { 0 { } } } }
549 { 8 { { 0 { 0 } } { 0 { } } } }
550 { 9 { { 0 { } } { 0 { } } } }
551 { 10 { { 0 { } } { 0 { } } } }
552 { 11 { { 0 { } } { 0 { } } } }
553 { 12 { { 0 { } } { 0 { } } } }
554 { 13 { { 1 { 0 } } { 0 { } } } }
555 { 14 { { 1 { } } { 0 { } } } }
556 { 15 { { 1 { } } { 0 { } } } }
557 { 16 { { 1 { } } { 0 { } } } }
558 { 17 { { 1 { } } { 0 { } } } }
559 { 18 { { 1 { } } { 0 { } } } }
560 { 19 { { 2 { 0 1 2 } } { 0 { } } } }
561 { 20 { { -1 { } } { 0 { } } } }
562 { 21 { { -1 { } } { 0 { } } } }
563 { 22 { { -1 { } } { 0 { } } } }
564 { 23 { { -1 { } } { 0 { } } } }
565 { 24 { { -1 { } } { 0 { } } } }
566 ! gc-map here scrubbing D: 0, D: 1 and D: 2
567 { 25 { { 2 { 0 1 2 } } { 0 { } } } }
568 { 26 { { 2 { 0 1 2 } } { 0 { } } } }
569 { 27 { { -2 { } } { 0 { } } } }
570 { 28 { { -1 { 0 } } { 0 { } } } }
571 { 29 { { -1 { } } { 0 { } } } }
572 { 30 { { -2 { } } { 0 { } } } }
573 { 31 { { -2 { } } { 0 { } } } }
574 { 32 { { -2 { } } { 0 { } } } }
575 { 33 { { -1 { 0 } } { 0 { } } } }
576 { 34 { { -1 { } } { 0 { } } } }
577 { 35 { { -1 { } } { 0 { } } } }
578 { 36 { { -1 { } } { 0 { } } } }
581 bug-benchmark-terrain-cfg trace-stack-state
585 ! following-stack-state
587 { { 0 { } } { 0 { } } }
588 } [ V{ } following-stack-state ] unit-test
591 { { 1 { 0 } } { 0 { } } }
592 } [ V{ T{ ##inc f D: 1 } } following-stack-state ] unit-test
595 { { 0 { } } { 1 { 0 } } }
596 } [ V{ T{ ##inc f R: 1 } } following-stack-state ] unit-test
598 ! Here the peek refers to a parameter of the word.
600 { { 0 { } } { 0 { } } }
603 T{ ##peek { loc D: 25 } }
604 } following-stack-state
608 { { 0 { } } { 0 { } } }
611 T{ ##replace { src 10 } { loc D: 0 } }
612 T{ ##replace { src 10 } { loc D: 1 } }
613 T{ ##replace { src 10 } { loc D: 2 } }
614 } following-stack-state
618 { { 1 { } } { 0 { } } }
621 T{ ##replace { src 10 } { loc D: 0 } }
623 T{ ##replace { src 10 } { loc D: 0 } }
624 } following-stack-state
628 { { 0 { } } { 0 { } } }
631 T{ ##replace { src 10 } { loc D: 0 } }
633 T{ ##replace { src 10 } { loc D: 0 } }
635 } following-stack-state
639 { { 0 { } } { 0 { } } }
643 T{ ##replace { src 10 } { loc D: 0 } }
645 } following-stack-state
648 ! ##call clears the overinitialized slots.
650 { { -1 { } } { 0 { } } }
653 T{ ##replace { src 10 } { loc D: 0 } }
656 } following-stack-state
659 ! Should not be ok because the value wasn't initialized when gc ran.
663 T{ ##alien-invoke { gc-map T{ gc-map } } }
664 T{ ##peek { loc D: 0 } }
665 } following-stack-state
666 ] [ vacant-peek? ] must-fail-with
671 T{ ##peek { loc D: 0 } }
672 } following-stack-state
673 ] [ vacant-peek? ] must-fail-with
678 T{ ##peek { loc R: 0 } }
679 } following-stack-state
680 ] [ vacant-peek? ] must-fail-with