From d11a779fdd3c23fc01805e35cf8e36e93a66dd6d Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 2 Nov 2008 03:58:32 -0600 Subject: [PATCH] RicE --- basis/compiler/cfg/def-use/def-use.factor | 10 ++++++++++ .../cfg/linear-scan/assignment/assignment.factor | 6 +++++- .../linear-scan/live-intervals/live-intervals.factor | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/basis/compiler/cfg/def-use/def-use.factor b/basis/compiler/cfg/def-use/def-use.factor index 8df048d956..2cbd7e54cb 100644 --- a/basis/compiler/cfg/def-use/def-use.factor +++ b/basis/compiler/cfg/def-use/def-use.factor @@ -32,3 +32,13 @@ M: ##alien-setter uses-vregs [ src>> ] [ value>> ] bi 2array ; M: _conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ; M: _compare-imm-branch uses-vregs src1>> 1array ; M: insn uses-vregs drop f ; + +UNION: vreg-insn +##flushable +##write-barrier +##dispatch +##effect +##conditional-branch +##compare-imm-branch +_conditional-branch +_compare-imm-branch ; diff --git a/basis/compiler/cfg/linear-scan/assignment/assignment.factor b/basis/compiler/cfg/linear-scan/assignment/assignment.factor index 2d8ad8c214..da45b45aaa 100644 --- a/basis/compiler/cfg/linear-scan/assignment/assignment.factor +++ b/basis/compiler/cfg/linear-scan/assignment/assignment.factor @@ -59,13 +59,17 @@ SYMBOL: unhandled-intervals ] [ 2drop ] if ] if ; -: (assign-registers) ( insn -- ) +GENERIC: (assign-registers) ( insn -- ) + +M: vreg-insn (assign-registers) dup [ defs-vregs ] [ uses-vregs ] bi append active-intervals get swap '[ vreg>> _ member? ] filter [ [ vreg>> ] [ reg>> ] bi ] { } map>assoc >>regs drop ; +M: insn (assign-registers) drop ; + : init-assignment ( live-intervals -- ) V{ } clone active-intervals set unhandled-intervals set 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 73fe904485..1055a3524a 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor @@ -40,7 +40,9 @@ SYMBOL: live-intervals GENERIC# compute-live-intervals* 1 ( insn n -- ) -M: insn compute-live-intervals* +M: insn compute-live-intervals* 2drop ; + +M: vreg-insn compute-live-intervals* live-intervals get [ [ uses-vregs ] 2dip '[ _ swap _ at add-use ] each ] [ [ defs-vregs ] 2dip '[ _ swap _ new-live-interval ] each ]