From ce25e0ad8db18bb68580e7b8d5ae6c175f4e93e6 Mon Sep 17 00:00:00 2001 From: Slava Pestov <slava@slava-pestovs-macbook-pro.local> Date: Tue, 26 May 2009 19:56:56 -0500 Subject: [PATCH] New local-optimization combinator removes some boilerplate --- .../cfg/alias-analysis/alias-analysis.factor | 17 +++++++---------- basis/compiler/cfg/height/height.factor | 12 +++++------- basis/compiler/cfg/liveness/liveness.factor | 4 ++-- basis/compiler/cfg/rpo/rpo.factor | 9 ++++++++- .../cfg/value-numbering/value-numbering.factor | 16 +++++++++------- .../cfg/write-barrier/write-barrier.factor | 9 +++++---- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/basis/compiler/cfg/alias-analysis/alias-analysis.factor b/basis/compiler/cfg/alias-analysis/alias-analysis.factor index 3a153740d5..8e1034fb0d 100644 --- a/basis/compiler/cfg/alias-analysis/alias-analysis.factor +++ b/basis/compiler/cfg/alias-analysis/alias-analysis.factor @@ -196,7 +196,7 @@ M: ##set-slot insn-object obj>> resolve ; M: ##set-slot-imm insn-object obj>> resolve ; M: ##alien-global insn-object drop \ ##alien-global ; -: init-alias-analysis ( basic-block -- ) +: init-alias-analysis ( live-in -- ) H{ } clone histories set H{ } clone vregs>acs set H{ } clone acs>vregs set @@ -204,7 +204,7 @@ M: ##alien-global insn-object drop \ ##alien-global ; H{ } clone constants set H{ } clone copies set - live-in keys [ set-heap-ac ] each + [ set-heap-ac ] each 0 ac-counter set next-ac heap-ac set ; @@ -291,13 +291,10 @@ M: insn eliminate-dead-stores* ; : eliminate-dead-stores ( insns -- insns' ) [ insn# set eliminate-dead-stores* ] map-index sift ; -: alias-analysis-step ( basic-block -- ) - dup init-alias-analysis - [ - analyze-aliases - compute-live-stores - eliminate-dead-stores - ] change-instructions drop ; +: alias-analysis-step ( insns -- insns' ) + analyze-aliases + compute-live-stores + eliminate-dead-stores ; : alias-analysis ( rpo -- ) - [ alias-analysis-step ] each ; \ No newline at end of file + [ init-alias-analysis ] [ alias-analysis-step ] local-optimization ; \ No newline at end of file diff --git a/basis/compiler/cfg/height/height.factor b/basis/compiler/cfg/height/height.factor index 9c305442e5..336a8a33c2 100644 --- a/basis/compiler/cfg/height/height.factor +++ b/basis/compiler/cfg/height/height.factor @@ -46,12 +46,10 @@ M: insn normalize-height* ; : height-step ( insns -- insns' ) 0 ds-height set 0 rs-height set - [ - [ [ compute-heights ] each ] - [ [ [ normalize-height* ] map sift ] with-scope ] bi - ds-height get dup zero? [ drop ] [ f \ ##inc-d boa prefix ] if - rs-height get dup zero? [ drop ] [ f \ ##inc-r boa prefix ] if - ] change-instructions drop ; + [ [ compute-heights ] each ] + [ [ [ normalize-height* ] map sift ] with-scope ] bi + ds-height get dup zero? [ drop ] [ f \ ##inc-d boa prefix ] if + rs-height get dup zero? [ drop ] [ f \ ##inc-r boa prefix ] if ; : normalize-height ( rpo -- ) - [ height-step ] each ; + [ ] [ height-step ] local-optimization ; diff --git a/basis/compiler/cfg/liveness/liveness.factor b/basis/compiler/cfg/liveness/liveness.factor index 66a584c613..7cc6158e68 100644 --- a/basis/compiler/cfg/liveness/liveness.factor +++ b/basis/compiler/cfg/liveness/liveness.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel namespaces deques accessors sets sequences assocs fry dlists -compiler.cfg.def-use compiler.cfg.rpo ; +USING: kernel namespaces deques accessors sets sequences assocs fry +dlists compiler.cfg.def-use ; IN: compiler.cfg.liveness ! This is a backward dataflow analysis. See http://en.wikipedia.org/wiki/Liveness_analysis diff --git a/basis/compiler/cfg/rpo/rpo.factor b/basis/compiler/cfg/rpo/rpo.factor index 766373175c..32ca87de97 100644 --- a/basis/compiler/cfg/rpo/rpo.factor +++ b/basis/compiler/cfg/rpo/rpo.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors namespaces make math sequences sets -assocs fry compiler.cfg compiler.cfg.instructions ; +assocs fry compiler.cfg compiler.cfg.instructions +compiler.cfg.liveness ; IN: compiler.cfg.rpo SYMBOL: visited @@ -28,3 +29,9 @@ SYMBOL: visited : each-basic-block ( cfg quot -- ) [ reverse-post-order ] dip each ; inline + +: optimize-basic-block ( bb init-quot insn-quot -- ) + [ '[ live-in keys _ each ] ] [ '[ _ change-instructions drop ] ] bi* bi ; inline + +: local-optimization ( rpo init-quot: ( live-in -- ) insn-quot: ( insns -- insns' ) -- ) + '[ _ _ optimize-basic-block ] each ; \ No newline at end of file diff --git a/basis/compiler/cfg/value-numbering/value-numbering.factor b/basis/compiler/cfg/value-numbering/value-numbering.factor index ac0c512bf8..b22c8b4388 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: namespaces assocs biassocs classes kernel math accessors sorting sets sequences -compiler.cfg.liveness +compiler.cfg.rpo compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.expressions compiler.cfg.value-numbering.propagate @@ -10,14 +10,16 @@ compiler.cfg.value-numbering.simplify compiler.cfg.value-numbering.rewrite ; IN: compiler.cfg.value-numbering -: number-input-values ( basic-block -- ) - live-in keys [ [ next-input-expr ] dip set-vn ] each ; +: number-input-values ( live-in -- ) + [ [ f next-input-expr ] dip set-vn ] each ; -: value-numbering-step ( basic-block -- ) +: init-value-numbering ( live-in -- ) init-value-graph init-expressions - dup number-input-values - [ [ [ number-values ] [ rewrite propagate ] bi ] map ] change-instructions drop ; + number-input-values ; + +: value-numbering-step ( insns -- insns' ) + [ [ number-values ] [ rewrite propagate ] bi ] map ; : value-numbering ( rpo -- ) - [ value-numbering-step ] each ; + [ init-value-numbering ] [ value-numbering-step ] local-optimization ; diff --git a/basis/compiler/cfg/write-barrier/write-barrier.factor b/basis/compiler/cfg/write-barrier/write-barrier.factor index 5a08296617..b952c062e7 100644 --- a/basis/compiler/cfg/write-barrier/write-barrier.factor +++ b/basis/compiler/cfg/write-barrier/write-barrier.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors namespaces assocs sets sequences locals -compiler.cfg compiler.cfg.instructions compiler.cfg.copy-prop ; +compiler.cfg compiler.cfg.instructions compiler.cfg.copy-prop +compiler.cfg.rpo ; IN: compiler.cfg.write-barrier ! Eliminate redundant write barrier hits. @@ -35,11 +36,11 @@ M: ##set-slot-imm eliminate-write-barrier M: insn eliminate-write-barrier ; -: write-barriers-step ( basic-block -- ) +: write-barriers-step ( insns -- insns' ) H{ } clone safe set H{ } clone mutated set H{ } clone copies set - [ [ eliminate-write-barrier ] map sift ] change-instructions drop ; + [ eliminate-write-barrier ] map sift ; : eliminate-write-barriers ( rpo -- ) - [ write-barriers-step ] each ; + [ ] [ write-barriers-step ] local-optimization ;