From c00af97fa16eb5931ea5d1359edee454d0c8be3d Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 4 Jul 2009 00:45:06 -0500 Subject: [PATCH] compiler.cfg.linear-scan.resolve: More fixes --- .../linear-scan/assignment/assignment.factor | 28 ++++---- .../cfg/linear-scan/linear-scan-tests.factor | 67 ++++++++++++++++++- 2 files changed, 82 insertions(+), 13 deletions(-) diff --git a/basis/compiler/cfg/linear-scan/assignment/assignment.factor b/basis/compiler/cfg/linear-scan/assignment/assignment.factor index c95771835a..e9f12ea668 100644 --- a/basis/compiler/cfg/linear-scan/assignment/assignment.factor +++ b/basis/compiler/cfg/linear-scan/assignment/assignment.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors kernel math assocs namespaces sequences heaps -fry make combinators sets +fry make combinators sets locals cpu.architecture compiler.cfg.def-use compiler.cfg.registers @@ -116,8 +116,8 @@ ERROR: already-reloaded ; ] [ 2drop ] if ] if ; -: prepare-insn ( insn -- ) - insn#>> [ expire-old-intervals ] [ activate-new-intervals ] bi ; +: prepare-insn ( n -- ) + [ expire-old-intervals ] [ activate-new-intervals ] bi ; GENERIC: assign-registers-in-insn ( insn -- ) @@ -171,29 +171,33 @@ M: ##gc assign-registers-in-insn M: insn assign-registers-in-insn drop ; : begin-block ( bb -- ) + dup block-from prepare-insn [ block-from compute-live-values ] keep register-live-ins get set-at ; : end-block ( bb -- ) [ block-to compute-live-values ] keep register-live-outs get set-at ; -: vreg-at-start ( vreg bb -- state ) register-live-ins get at at ; +ERROR: bad-vreg vreg ; -: vreg-at-end ( vreg bb -- state ) register-live-outs get at at ; +: vreg-at-start ( vreg bb -- state ) + register-live-ins get at ?at [ bad-vreg ] unless ; -: assign-registers-in-block ( bb -- ) - dup - begin-block - [ +: vreg-at-end ( vreg bb -- state ) + register-live-outs get at ?at [ bad-vreg ] unless ; + +:: assign-registers-in-block ( bb -- ) + bb [ [ + bb begin-block [ - [ prepare-insn ] + [ insn#>> prepare-insn ] [ assign-registers-in-insn ] [ , ] tri ] each + bb end-block ] V{ } make - ] change-instructions - end-block ; + ] change-instructions drop ; : assign-registers ( live-intervals rpo -- ) [ init-assignment ] dip diff --git a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor index 377b3bff74..63d31dfb4e 100644 --- a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor +++ b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor @@ -1910,4 +1910,69 @@ V{ [ t ] [ 3 get instructions>> [ _spill? ] any? ] unit-test -[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test \ No newline at end of file +[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test + +! A more complicated failure case with resolve that came up after the above +! got fixed +V{ T{ ##branch } } 0 test-bb +V{ + T{ ##peek f V int-regs 0 D 0 } + T{ ##peek f V int-regs 1 D 1 } + T{ ##peek f V int-regs 2 D 2 } + T{ ##peek f V int-regs 3 D 3 } + T{ ##peek f V int-regs 4 D 0 } + T{ ##branch } +} 1 test-bb +V{ T{ ##branch } } 2 test-bb +V{ T{ ##branch } } 3 test-bb +V{ + + T{ ##replace f V int-regs 1 D 1 } + T{ ##replace f V int-regs 2 D 2 } + T{ ##replace f V int-regs 3 D 3 } + T{ ##replace f V int-regs 4 D 4 } + T{ ##replace f V int-regs 0 D 0 } + T{ ##branch } +} 4 test-bb +V{ T{ ##replace f V int-regs 0 D 0 } T{ ##branch } } 5 test-bb +V{ T{ ##return } } 6 test-bb +V{ T{ ##branch } } 7 test-bb +V{ + T{ ##replace f V int-regs 1 D 1 } + T{ ##replace f V int-regs 2 D 2 } + T{ ##replace f V int-regs 3 D 3 } + T{ ##peek f V int-regs 5 D 1 } + T{ ##peek f V int-regs 6 D 2 } + T{ ##peek f V int-regs 7 D 3 } + T{ ##peek f V int-regs 8 D 4 } + T{ ##replace f V int-regs 5 D 1 } + T{ ##replace f V int-regs 6 D 2 } + T{ ##replace f V int-regs 7 D 3 } + T{ ##replace f V int-regs 8 D 4 } + T{ ##branch } +} 8 test-bb +V{ + T{ ##replace f V int-regs 1 D 1 } + T{ ##replace f V int-regs 2 D 2 } + T{ ##replace f V int-regs 3 D 3 } + T{ ##return } +} 9 test-bb + +0 get 1 get 1vector >>successors drop +1 get 2 get 7 get V{ } 2sequence >>successors drop +7 get 8 get 1vector >>successors drop +8 get 9 get 1vector >>successors drop +2 get 3 get 5 get V{ } 2sequence >>successors drop +3 get 4 get 1vector >>successors drop +4 get 9 get 1vector >>successors drop +5 get 6 get 1vector >>successors drop + +[ ] [ { 1 2 3 4 } test-linear-scan-on-cfg ] unit-test + +[ _spill ] [ 1 get instructions>> second class ] unit-test +[ _reload ] [ 4 get instructions>> 4 swap nth class ] unit-test +[ V{ 3 2 1 } ] [ 8 get instructions>> [ _spill? ] filter [ n>> ] map ] unit-test +[ V{ 3 2 1 } ] [ 9 get instructions>> [ _reload? ] filter [ n>> ] map ] unit-test + +! Resolve pass should insert this +[ _reload ] [ 5 get instructions>> first class ] unit-test \ No newline at end of file