From d1f6871081efeb085bc6cb5e61fa2ed2d9539bf7 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 30 Jun 2009 16:44:14 -0500 Subject: [PATCH] fix bug where traversal order was lost --- .../cfg/instructions/instructions.factor | 2 +- .../linear-scan/resolve/resolve-tests.factor | 30 +++++++++---------- .../cfg/linear-scan/resolve/resolve.factor | 22 +++++++++++--- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 5b3e1af930..4ce9c59e7e 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -248,4 +248,4 @@ INSN: _reload dst class n ; INSN: _copy dst src class ; INSN: _spill-counts counts ; -SYMBOL: temp-spill +SYMBOL: spill-temp diff --git a/basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor b/basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor index df9f29e999..feb9ac2504 100644 --- a/basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor +++ b/basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor @@ -68,12 +68,12 @@ T{ live-interval [ { T{ _copy { dst 5 } { src 4 } { class int-regs } } - T{ _spill { src 0 } { class int-regs } { n spill-temp } } - T{ _copy { dst 0 } { src 1 } { class int-regs } } - T{ _reload { dst 1 } { class int-regs } { n spill-temp } } - T{ _spill { src 0 } { class float-regs } { n spill-temp } } - T{ _copy { dst 0 } { src 1 } { class float-regs } } - T{ _reload { dst 1 } { class float-regs } { n spill-temp } } + T{ _spill { src 1 } { class int-regs } { n spill-temp } } + T{ _copy { dst 1 } { src 0 } { class int-regs } } + T{ _reload { dst 0 } { class int-regs } { n spill-temp } } + T{ _spill { src 1 } { class float-regs } { n spill-temp } } + T{ _copy { dst 1 } { src 0 } { class float-regs } } + T{ _reload { dst 0 } { class float-regs } { n spill-temp } } } ] [ { @@ -87,10 +87,10 @@ T{ live-interval [ { - T{ _spill { src 0 } { class int-regs } { n spill-temp } } - T{ _copy { dst 0 } { src 2 } { class int-regs } } + T{ _spill { src 2 } { class int-regs } { n spill-temp } } T{ _copy { dst 2 } { src 1 } { class int-regs } } - T{ _reload { dst 1 } { class int-regs } { n spill-temp } } + T{ _copy { dst 1 } { src 0 } { class int-regs } } + T{ _reload { dst 0 } { class int-regs } { n spill-temp } } } ] [ { @@ -162,10 +162,10 @@ T{ live-interval { T{ _copy { dst 1 } { src 0 } { class int-regs } } T{ _copy { dst 2 } { src 0 } { class int-regs } } - T{ _spill { src 3 } { class int-regs } { n spill-temp } } + T{ _spill { src 4 } { class int-regs } { n spill-temp } } T{ _copy { dst 4 } { src 0 } { class int-regs } } - T{ _copy { dst 3 } { src 4 } { class int-regs } } - T{ _reload { dst 0 } { class int-regs } { n spill-temp } } + T{ _copy { dst 0 } { src 3 } { class int-regs } } + T{ _reload { dst 3 } { class int-regs } { n spill-temp } } } ] [ { @@ -182,10 +182,10 @@ T{ live-interval T{ _copy { dst 2 } { src 0 } { class int-regs } } T{ _copy { dst 9 } { src 1 } { class int-regs } } T{ _copy { dst 1 } { src 0 } { class int-regs } } - T{ _spill { src 3 } { class int-regs } { n spill-temp } } + T{ _spill { src 4 } { class int-regs } { n spill-temp } } T{ _copy { dst 4 } { src 0 } { class int-regs } } - T{ _copy { dst 3 } { src 4 } { class int-regs } } - T{ _reload { dst 0 } { class int-regs } { n spill-temp } } + T{ _copy { dst 0 } { src 3 } { class int-regs } } + T{ _reload { dst 3 } { class int-regs } { n spill-temp } } } ] [ { diff --git a/basis/compiler/cfg/linear-scan/resolve/resolve.factor b/basis/compiler/cfg/linear-scan/resolve/resolve.factor index b996520546..bd7528291d 100644 --- a/basis/compiler/cfg/linear-scan/resolve/resolve.factor +++ b/basis/compiler/cfg/linear-scan/resolve/resolve.factor @@ -126,22 +126,36 @@ M: register->register to-loc drop register ; :: (trace-chain) ( obj hashtable -- ) obj to-reg froms get at* [ + dup , obj over hashtable clone [ maybe-set-at ] keep swap - [ (trace-chain) ] [ , drop ] if + [ (trace-chain) ] [ 2drop ] if ] [ - drop hashtable , + drop ] if ; : trace-chain ( obj -- seq ) [ + dup , dup dup associate (trace-chain) - ] { } make [ keys ] map concat reverse ; + ] { } make prune reverse ; + : trace-chains ( seq -- seq' ) [ trace-chain ] map concat ; -: break-cycle-n ( operations -- operations' ) +ERROR: resolve-error ; + +: split-cycle ( operations -- chain spilled-operation ) unclip [ + [ set-tos/froms ] + [ + [ start? ] find nip + [ resolve-error ] unless* trace-chain + ] bi + ] dip ; + +: break-cycle-n ( operations -- operations' ) + split-cycle [ [ from>> spill-temp ] [ reg-class>> ] bi \ register->memory boa ] [