From 418438ab13dc48c9b126e8801615d3a77f1295c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Sun, 14 Jun 2015 08:53:00 +0200 Subject: [PATCH] compiler.cfg.linear-scan.*: change compute-live-intervals so that it returns only one sequence, it makes some words a little simpler --- .../linear-scan/allocation/allocation.factor | 2 +- .../allocation/state/state-tests.factor | 8 +-- .../linear-scan/allocation/state/state.factor | 9 +-- .../cfg/linear-scan/debugger/debugger.factor | 1 - .../cfg/linear-scan/linear-scan-tests.factor | 2 +- .../live-intervals-tests.factor | 62 ++++++++++++++++++- .../live-intervals/live-intervals.factor | 18 +++--- 7 files changed, 77 insertions(+), 25 deletions(-) diff --git a/basis/compiler/cfg/linear-scan/allocation/allocation.factor b/basis/compiler/cfg/linear-scan/allocation/allocation.factor index a329870433..7ad4f3a527 100644 --- a/basis/compiler/cfg/linear-scan/allocation/allocation.factor +++ b/basis/compiler/cfg/linear-scan/allocation/allocation.factor @@ -63,6 +63,6 @@ M: sync-point handle ( sync-point -- ) handled-intervals get active-intervals inactive-intervals [ get values concat ] bi@ 3append ; -: allocate-registers ( live-intervals sync-point registers -- live-intervals' ) +: allocate-registers ( intervals/sync-point registers -- live-intervals' ) init-allocator unhandled-min-heap get (allocate-registers) gather-intervals ; diff --git a/basis/compiler/cfg/linear-scan/allocation/state/state-tests.factor b/basis/compiler/cfg/linear-scan/allocation/state/state-tests.factor index 4eb76c0c6a..cde24f631d 100644 --- a/basis/compiler/cfg/linear-scan/allocation/state/state-tests.factor +++ b/basis/compiler/cfg/linear-scan/allocation/state/state-tests.factor @@ -9,7 +9,7 @@ IN: compiler.cfg.linear-scan.allocation.state.tests { V{ T{ live-interval-state { reg-class int-regs } { vreg 123 } } } } [ - f f machine-registers init-allocator + f machine-registers init-allocator T{ live-interval-state { reg-class int-regs } { vreg 123 } } [ add-active ] keep active-intervals-for ] unit-test @@ -29,7 +29,7 @@ IN: compiler.cfg.linear-scan.allocation.state.tests { float-regs V{ } } } } [ - f f machine-registers init-allocator + f machine-registers init-allocator T{ live-interval-state { reg-class int-regs } { vreg 123 } } add-active active-intervals get ] unit-test @@ -164,8 +164,6 @@ cpu x86.64? [ T{ live-interval-state { start 20 } { end 30 } } T{ live-interval-state { start 20 } { end 28 } } T{ live-interval-state { start 33 } { end 999 } } - } - { T{ sync-point { n 5 } } T{ sync-point { n 33 } } T{ sync-point { n 100 } } @@ -177,5 +175,5 @@ cpu x86.64? [ { T{ live-interval-state { start 20 } { end 30 } } T{ live-interval-state { start 20 } { end 30 } } - } { } >unhandled-min-heap heap-size + } >unhandled-min-heap heap-size ] unit-test diff --git a/basis/compiler/cfg/linear-scan/allocation/state/state.factor b/basis/compiler/cfg/linear-scan/allocation/state/state.factor index c267f31709..6d218e2c11 100644 --- a/basis/compiler/cfg/linear-scan/allocation/state/state.factor +++ b/basis/compiler/cfg/linear-scan/allocation/state/state.factor @@ -26,11 +26,8 @@ M: live-interval-state interval/sync-point-key M: sync-point interval/sync-point-key n>> 1/0. 1/0. 3array ; -: zip-keyed ( seq quot: ( elt -- key ) -- alist ) - [ keep ] curry { } map>assoc ; inline - -: >unhandled-min-heap ( live-intervals sync-points -- min-heap ) - append [ interval/sync-point-key ] zip-keyed >min-heap ; +: >unhandled-min-heap ( intervals/sync-points -- min-heap ) + [ [ interval/sync-point-key ] keep 2array ] map >min-heap ; SYMBOL: registers @@ -134,7 +131,7 @@ SYMBOL: spill-slots : lookup-spill-slot ( coalesced-vreg rep -- spill-slot ) rep-size 2array spill-slots get ?at [ ] [ bad-vreg ] if ; -: init-allocator ( live-intervals sync-points registers -- ) +: init-allocator ( intervals/sync-points registers -- ) registers set >unhandled-min-heap unhandled-min-heap set [ V{ } clone ] reg-class-assoc active-intervals set diff --git a/basis/compiler/cfg/linear-scan/debugger/debugger.factor b/basis/compiler/cfg/linear-scan/debugger/debugger.factor index cf68e12a4d..9e87559ac2 100644 --- a/basis/compiler/cfg/linear-scan/debugger/debugger.factor +++ b/basis/compiler/cfg/linear-scan/debugger/debugger.factor @@ -10,7 +10,6 @@ IN: compiler.cfg.linear-scan.debugger [ [ clone ] map dup [ [ vreg>> ] keep ] H{ } map>assoc live-intervals set - f ] dip allocate-registers drop ; diff --git a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor index 6efbeb3e2b..db0db01dbb 100644 --- a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor +++ b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor @@ -40,7 +40,7 @@ V{ : test-live-intervals ( -- ) 0 get block>cfg [ cfg set ] [ number-instructions ] [ compute-live-intervals ] tri - 2drop ; + drop ; [ ] [ H{ diff --git a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor index 7c19b5b29a..2f4d51b606 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor @@ -1,4 +1,6 @@ -USING: compiler.cfg.linear-scan.live-intervals cpu.architecture kernel +USING: arrays compiler.cfg compiler.cfg.linear-scan.live-intervals +compiler.cfg.liveness compiler.cfg.registers +compiler.cfg.ssa.destruction.leaders cpu.architecture kernel namespaces sequences tools.test ; IN: compiler.cfg.linear-scan.live-intervals.tests @@ -14,3 +16,61 @@ IN: compiler.cfg.linear-scan.live-intervals.tests 5 int-rep dup { { 5 10 } { 8 12 } } [ first2 rot add-range ] with each ] unit-test + +{ + T{ live-interval-state + { vreg 5 } + { ranges V{ T{ live-range { from 5 } { to 12 } } } } + { uses V{ } } + { reg-class int-rep } + } +} [ + 5 int-rep dup + { { 10 12 } { 5 10 } } [ first2 rot add-range ] with each +] unit-test + +! handle-live-out +{ } [ + H{ } clone live-outs set + handle-live-out +] unit-test + +{ + H{ + { + 8 + T{ live-interval-state + { vreg 8 } + { ranges V{ T{ live-range { from -10 } { to 23 } } } } + { uses V{ } } + { reg-class int-regs } + } + } + { + 9 + T{ live-interval-state + { vreg 9 } + { ranges V{ T{ live-range { from -10 } { to 23 } } } } + { uses V{ } } + { reg-class int-regs } + } + } + { + 4 + T{ live-interval-state + { vreg 4 } + { ranges V{ T{ live-range { from -10 } { to 23 } } } } + { uses V{ } } + { reg-class int-regs } + } + } + } +} [ + -10 from set + 23 to set + init-live-intervals + H{ { 4 4 } { 8 8 } { 9 9 } } leader-map set + H{ { 4 int-rep } { 8 int-rep } { 9 int-rep } } representations set + [ H{ { 4 4 } { 8 8 } { 9 9 } } 2array 1array live-outs set ] + [ handle-live-out ] bi live-intervals get +] unit-test diff --git a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor index 97211a9152..82baf6d925 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor @@ -154,10 +154,8 @@ M: hairy-clobber-insn compute-live-intervals* ( insn -- ) 2tri ; : handle-live-out ( bb -- ) - live-out dup assoc-empty? [ drop ] [ - [ from get to get ] dip keys - [ live-interval add-range ] 2with each - ] if ; + [ from get to get ] dip live-out keys + [ live-interval add-range ] 2with each ; TUPLE: sync-point n keep-dst? ; @@ -202,8 +200,8 @@ ERROR: bad-live-interval live-interval ; : check-start ( live-interval -- ) dup start>> -1 = [ bad-live-interval ] [ drop ] if ; -: finish-live-intervals ( live-intervals -- seq ) - values dup [ +: finish-live-intervals ( live-intervals -- ) + [ { [ [ { } like reverse! ] change-ranges drop ] [ [ { } like reverse! ] change-uses drop ] @@ -212,12 +210,12 @@ ERROR: bad-live-interval live-interval ; } cleave ] each ; -: compute-live-intervals ( cfg -- live-intervals sync-points ) +: compute-live-intervals ( cfg -- intervals/sync-points ) init-live-intervals - linearization-order [ kill-block?>> ] reject + linearization-order [ kill-block?>> ] reject [ compute-live-intervals-step ] each - live-intervals get finish-live-intervals - sync-points get ; + live-intervals get values dup finish-live-intervals + sync-points get append ; : relevant-ranges ( interval1 interval2 -- ranges1 ranges2 ) [ [ ranges>> ] bi@ ] [ nip start>> ] 2bi '[ to>> _ >= ] filter ;