diff --git a/basis/compiler/cfg/alias-analysis/alias-analysis.factor b/basis/compiler/cfg/alias-analysis/alias-analysis.factor index 3cf099d149..438395e2a7 100644 --- a/basis/compiler/cfg/alias-analysis/alias-analysis.factor +++ b/basis/compiler/cfg/alias-analysis/alias-analysis.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: kernel math namespaces assocs hashtables sequences arrays accessors words vectors combinators combinators.short-circuit -sets classes layouts cpu.architecture +sets classes layouts fry cpu.architecture compiler.cfg compiler.cfg.rpo compiler.cfg.def-use @@ -100,6 +100,15 @@ SYMBOL: acs>vregs : each-alias ( vreg quot -- ) [ aliases ] dip each ; inline +: merge-acs ( vreg into -- ) + [ vreg>ac ] dip + 2dup eq? [ 2drop ] [ + [ ac>vregs ] dip + [ vregs>acs get '[ [ _ ] dip _ set-at ] each ] + [ acs>vregs get at push-all ] + 2bi + ] if ; + ! Map vregs -> slot# -> vreg SYMBOL: live-slots @@ -187,7 +196,8 @@ SYMBOL: heap-ac : remember-set-slot ( slot#/f vreg -- ) over [ [ record-constant-set-slot ] - [ kill-constant-set-slot ] 2bi + [ kill-constant-set-slot ] + 2bi ] [ nip kill-computed-set-slot ] if ; GENERIC: insn-slot# ( insn -- slot#/f ) @@ -262,7 +272,10 @@ M: ##write analyze-aliases* dup [ src>> resolve ] [ insn-slot# ] [ insn-object ] tri 3dup idempotent? [ 3drop ] [ - [ remember-set-slot drop ] [ load-slot ] 3bi + [ 2drop heap-ac get merge-acs ] + [ remember-set-slot drop ] + [ load-slot ] + 3tri ] if ; M: ##copy analyze-aliases* diff --git a/basis/compiler/cfg/empty-blocks/empty-blocks.factor b/basis/compiler/cfg/empty-blocks/empty-blocks.factor deleted file mode 100644 index 605c572cb3..0000000000 --- a/basis/compiler/cfg/empty-blocks/empty-blocks.factor +++ /dev/null @@ -1,47 +0,0 @@ -! Copyright (C) 2008, 2009 Slava Pestov. -! See http://factorcode.org/license.txt for BSD license. -USING: kernel accessors sequences namespaces combinators -combinators.short-circuit classes vectors compiler.cfg -compiler.cfg.instructions compiler.cfg.rpo ; -IN: compiler.cfg.empty-blocks - -> first [ - [ - 2dup eq? [ drop successors>> first ] [ nip ] if - ] with map - ] change-successors drop ; - -: update-successor ( bb -- ) - ! We have to replace occurrences of bb with bb's predecessor - ! in bb's sucessor's list of predecessors. - dup successors>> first [ - [ - 2dup eq? [ drop predecessors>> first ] [ nip ] if - ] with map - ] change-predecessors drop ; - -SYMBOL: changed? - -: delete-basic-block ( bb -- ) - [ update-predecessor ] [ update-successor ] bi - changed? on ; - -: delete-basic-block? ( bb -- ? ) - { - [ instructions>> length 1 = ] - [ predecessors>> length 1 = ] - [ successors>> length 1 = ] - [ instructions>> first ##branch? ] - } 1&& ; - -PRIVATE> - -: delete-empty-blocks ( cfg -- cfg' ) - changed? off - dup [ dup delete-basic-block? [ delete-basic-block ] [ drop ] if ] each-basic-block - changed? get [ cfg-changed ] when ; \ No newline at end of file diff --git a/basis/compiler/cfg/finalization/finalization.factor b/basis/compiler/cfg/finalization/finalization.factor index a5f65d7c78..5440ba6eef 100644 --- a/basis/compiler/cfg/finalization/finalization.factor +++ b/basis/compiler/cfg/finalization/finalization.factor @@ -1,9 +1,9 @@ ! Copyright (C) 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: compiler.cfg.empty-blocks compiler.cfg.gc-checks -compiler.cfg.representations compiler.cfg.save-contexts -compiler.cfg.ssa.destruction compiler.cfg.build-stack-frame -compiler.cfg.linear-scan compiler.cfg.scheduling ; +USING: compiler.cfg.gc-checks compiler.cfg.representations +compiler.cfg.save-contexts compiler.cfg.ssa.destruction +compiler.cfg.build-stack-frame compiler.cfg.linear-scan +compiler.cfg.scheduling ; IN: compiler.cfg.finalization : finalize-cfg ( cfg -- cfg' ) diff --git a/basis/compiler/cfg/optimizer/optimizer.factor b/basis/compiler/cfg/optimizer/optimizer.factor index ba7d31d141..5881cd78ea 100644 --- a/basis/compiler/cfg/optimizer/optimizer.factor +++ b/basis/compiler/cfg/optimizer/optimizer.factor @@ -10,13 +10,7 @@ compiler.cfg.alias-analysis compiler.cfg.value-numbering compiler.cfg.copy-prop compiler.cfg.dce -compiler.cfg.write-barrier -compiler.cfg.representations -compiler.cfg.gc-checks -compiler.cfg.save-contexts -compiler.cfg.ssa.destruction -compiler.cfg.empty-blocks -compiler.cfg.checker ; +compiler.cfg.write-barrier ; IN: compiler.cfg.optimizer : optimize-cfg ( cfg -- cfg' )