compiler.cfg.*: changed stack effect of needs-predecessors from ( cfg -- cfg') to ( cfg -- )
parent
76cb665a8d
commit
e5866dfa80
|
@ -1,8 +1,8 @@
|
||||||
! Copyright (C) 2009 Slava Pestov.
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors combinators.short-circuit kernel sequences math
|
USING: accessors combinators combinators.short-circuit compiler.utilities
|
||||||
compiler.utilities compiler.cfg compiler.cfg.instructions compiler.cfg.rpo
|
compiler.cfg compiler.cfg.instructions compiler.cfg.rpo
|
||||||
compiler.cfg.predecessors compiler.cfg.utilities ;
|
compiler.cfg.predecessors compiler.cfg.utilities kernel math sequences ;
|
||||||
IN: compiler.cfg.block-joining
|
IN: compiler.cfg.block-joining
|
||||||
|
|
||||||
! Joining blocks that are not calls and are connected by a single CFG edge.
|
! Joining blocks that are not calls and are connected by a single CFG edge.
|
||||||
|
@ -27,10 +27,14 @@ IN: compiler.cfg.block-joining
|
||||||
[ join-instructions ] [ update-successors ] 2bi ;
|
[ join-instructions ] [ update-successors ] 2bi ;
|
||||||
|
|
||||||
: join-blocks ( cfg -- )
|
: join-blocks ( cfg -- )
|
||||||
needs-predecessors
|
{
|
||||||
[
|
[ needs-predecessors ]
|
||||||
post-order [
|
[
|
||||||
dup join-block?
|
post-order [
|
||||||
[ dup predecessor join-block ] [ drop ] if
|
dup join-block?
|
||||||
] each
|
[ dup predecessor join-block ] [ drop ] if
|
||||||
] [ cfg-changed ] [ predecessors-changed ] tri ;
|
] each
|
||||||
|
]
|
||||||
|
[ cfg-changed ]
|
||||||
|
[ predecessors-changed ]
|
||||||
|
} cleave ;
|
||||||
|
|
|
@ -9,13 +9,11 @@ IN: compiler.cfg.branch-splitting.tests
|
||||||
|
|
||||||
: check-predecessors ( cfg -- )
|
: check-predecessors ( cfg -- )
|
||||||
[ get-predecessors ]
|
[ get-predecessors ]
|
||||||
[ needs-predecessors drop ]
|
[ needs-predecessors ]
|
||||||
[ get-predecessors ] tri assert= ;
|
[ get-predecessors ] tri assert= ;
|
||||||
|
|
||||||
: check-branch-splitting ( cfg -- )
|
: check-branch-splitting ( cfg -- )
|
||||||
needs-predecessors
|
[ needs-predecessors ] [ split-branches ] [ check-predecessors ] tri ;
|
||||||
split-branches
|
|
||||||
check-predecessors ;
|
|
||||||
|
|
||||||
: test-branch-splitting ( -- )
|
: test-branch-splitting ( -- )
|
||||||
0 get block>cfg check-branch-splitting ;
|
0 get block>cfg check-branch-splitting ;
|
||||||
|
|
|
@ -94,14 +94,16 @@ SYMBOL: visited
|
||||||
entry>> add-to-worklist ;
|
entry>> add-to-worklist ;
|
||||||
|
|
||||||
: split-branches ( cfg -- )
|
: split-branches ( cfg -- )
|
||||||
needs-predecessors
|
{
|
||||||
dup init-worklist
|
[ needs-predecessors ]
|
||||||
! For back-edge?
|
[ init-worklist ]
|
||||||
dup post-order drop
|
[
|
||||||
|
! For back-edge?
|
||||||
worklist get [
|
post-order drop
|
||||||
dup split-branch? [ dup split-branch ] when
|
worklist get [
|
||||||
successors>> [ add-to-worklist ] each
|
dup split-branch? [ dup split-branch ] when
|
||||||
] slurp-deque
|
successors>> [ add-to-worklist ] each
|
||||||
|
] slurp-deque
|
||||||
cfg-changed ;
|
]
|
||||||
|
[ cfg-changed ]
|
||||||
|
} cleave ;
|
||||||
|
|
|
@ -120,7 +120,9 @@ PRIVATE>
|
||||||
USE: compiler.cfg
|
USE: compiler.cfg
|
||||||
|
|
||||||
: copy-propagation ( cfg -- )
|
: copy-propagation ( cfg -- )
|
||||||
needs-predecessors
|
{
|
||||||
dup collect-copies
|
[ needs-predecessors ]
|
||||||
dup rename-copies
|
[ collect-copies ]
|
||||||
predecessors-changed ;
|
[ rename-copies ]
|
||||||
|
[ predecessors-changed ]
|
||||||
|
} cleave ;
|
||||||
|
|
|
@ -47,7 +47,7 @@ MIXIN: dataflow-analysis
|
||||||
] when ; inline
|
] when ; inline
|
||||||
|
|
||||||
:: run-dataflow-analysis ( cfg dfa -- in-sets out-sets )
|
:: run-dataflow-analysis ( cfg dfa -- in-sets out-sets )
|
||||||
cfg needs-predecessors drop
|
cfg needs-predecessors
|
||||||
H{ } clone :> in-sets
|
H{ } clone :> in-sets
|
||||||
H{ } clone :> out-sets
|
H{ } clone :> out-sets
|
||||||
cfg dfa <dfa-worklist> :> work-list
|
cfg dfa <dfa-worklist> :> work-list
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg.
|
! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors arrays assocs kernel namespaces sequences
|
USING: accessors arrays assocs kernel namespaces sequences combinators
|
||||||
compiler.cfg.instructions compiler.cfg.def-use
|
compiler.cfg.instructions compiler.cfg.def-use
|
||||||
compiler.cfg.rpo compiler.cfg.predecessors hash-sets sets ;
|
compiler.cfg.rpo compiler.cfg.predecessors hash-sets sets ;
|
||||||
FROM: assocs => change-at ;
|
FROM: assocs => change-at ;
|
||||||
|
@ -116,13 +116,13 @@ M: flushable-insn live-insn? defs-vregs [ live-vreg? ] any? ;
|
||||||
M: insn live-insn? drop t ;
|
M: insn live-insn? drop t ;
|
||||||
|
|
||||||
: eliminate-dead-code ( cfg -- )
|
: eliminate-dead-code ( cfg -- )
|
||||||
|
init-dead-code
|
||||||
! Even though we don't use predecessors directly, we depend
|
! Even though we don't use predecessors directly, we depend
|
||||||
! on the predecessors pass updating phi nodes to remove dead
|
! on the predecessors pass updating phi nodes to remove dead
|
||||||
! inputs.
|
! inputs.
|
||||||
needs-predecessors
|
{
|
||||||
|
[ needs-predecessors ]
|
||||||
init-dead-code
|
[ [ [ build-liveness-graph ] each ] simple-analysis ]
|
||||||
[ [ [ build-liveness-graph ] each ] simple-analysis ]
|
[ [ [ compute-live-vregs ] each ] simple-analysis ]
|
||||||
[ [ [ compute-live-vregs ] each ] simple-analysis ]
|
[ [ [ live-insn? ] filter! ] simple-optimization ]
|
||||||
[ [ [ live-insn? ] filter! ] simple-optimization ]
|
} cleave ;
|
||||||
tri ;
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ PRIVATE>
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: needs-dominance ( cfg -- )
|
: needs-dominance ( cfg -- )
|
||||||
needs-predecessors
|
dup needs-predecessors
|
||||||
dup dominance-valid?>> [ compute-dominance t >>dominance-valid? ] unless
|
dup dominance-valid?>> [ compute-dominance t >>dominance-valid? ] unless
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ PRIVATE>
|
||||||
|
|
||||||
: insert-gc-checks ( cfg -- cfg' )
|
: insert-gc-checks ( cfg -- cfg' )
|
||||||
dup blocks-with-gc [
|
dup blocks-with-gc [
|
||||||
[ needs-predecessors ] dip
|
[ dup needs-predecessors ] dip
|
||||||
[ process-block ] each
|
[ process-block ] each
|
||||||
dup cfg-changed
|
dup cfg-changed
|
||||||
] unless-empty ;
|
] unless-empty ;
|
||||||
|
|
|
@ -107,6 +107,6 @@ SYMBOL: temp-locations
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: resolve-data-flow ( cfg -- )
|
: resolve-data-flow ( cfg -- )
|
||||||
needs-predecessors
|
|
||||||
init-resolve
|
init-resolve
|
||||||
[ resolve-block-data-flow ] each-basic-block ;
|
[ needs-predecessors ]
|
||||||
|
[ [ resolve-block-data-flow ] each-basic-block ] bi ;
|
||||||
|
|
|
@ -75,7 +75,7 @@ SYMBOLS: work-list loop-heads visited ;
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: linearization-order ( cfg -- bbs )
|
: linearization-order ( cfg -- bbs )
|
||||||
needs-post-order needs-loops needs-predecessors
|
needs-post-order needs-loops dup needs-predecessors
|
||||||
|
|
||||||
dup linear-order>> [ ] [
|
dup linear-order>> [ ] [
|
||||||
dup (linearization-order)
|
dup (linearization-order)
|
||||||
|
|
|
@ -158,15 +158,15 @@ SYMBOL: work-list
|
||||||
] [ drop ] if ;
|
] [ drop ] if ;
|
||||||
|
|
||||||
: compute-live-sets ( cfg -- )
|
: compute-live-sets ( cfg -- )
|
||||||
needs-predecessors
|
|
||||||
dup compute-insns
|
|
||||||
|
|
||||||
<hashed-dlist> work-list set
|
<hashed-dlist> work-list set
|
||||||
H{ } clone live-ins set
|
H{ } clone live-ins set
|
||||||
H{ } clone edge-live-ins set
|
H{ } clone edge-live-ins set
|
||||||
H{ } clone live-outs set
|
H{ } clone live-outs set
|
||||||
H{ } clone base-pointers set
|
H{ } clone base-pointers set
|
||||||
post-order add-to-work-list
|
|
||||||
|
[ needs-predecessors ]
|
||||||
|
[ compute-insns ]
|
||||||
|
[ post-order add-to-work-list ] tri
|
||||||
work-list get [ liveness-step ] slurp-deque ;
|
work-list get [ liveness-step ] slurp-deque ;
|
||||||
|
|
||||||
: live-in? ( vreg bb -- ? ) live-in key? ;
|
: live-in? ( vreg bb -- ? ) live-in key? ;
|
||||||
|
|
|
@ -63,12 +63,13 @@ SYMBOL: loop-nesting
|
||||||
] keep loop-nesting set ;
|
] keep loop-nesting set ;
|
||||||
|
|
||||||
: detect-loops ( cfg -- cfg' )
|
: detect-loops ( cfg -- cfg' )
|
||||||
needs-predecessors
|
|
||||||
H{ } clone loops set
|
H{ } clone loops set
|
||||||
HS{ } clone visited set
|
HS{ } clone visited set
|
||||||
HS{ } clone active set
|
HS{ } clone active set
|
||||||
H{ } clone loop-nesting set
|
H{ } clone loop-nesting set
|
||||||
dup entry>> find-loop-headers process-loop-headers compute-loop-nesting ;
|
[ needs-predecessors ]
|
||||||
|
[ entry>> find-loop-headers process-loop-headers compute-loop-nesting ]
|
||||||
|
[ ] tri ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -77,5 +78,5 @@ PRIVATE>
|
||||||
: current-loop-nesting ( -- n ) basic-block get loop-nesting-at ;
|
: current-loop-nesting ( -- n ) basic-block get loop-nesting-at ;
|
||||||
|
|
||||||
: needs-loops ( cfg -- cfg' )
|
: needs-loops ( cfg -- cfg' )
|
||||||
needs-predecessors
|
dup needs-predecessors
|
||||||
dup loops-valid?>> [ detect-loops t >>loops-valid? ] unless ;
|
dup loops-valid?>> [ detect-loops t >>loops-valid? ] unless ;
|
||||||
|
|
|
@ -2,5 +2,5 @@ USING: compiler.cfg help.markup help.syntax kernel ;
|
||||||
IN: compiler.cfg.predecessors
|
IN: compiler.cfg.predecessors
|
||||||
|
|
||||||
HELP: needs-predecessors
|
HELP: needs-predecessors
|
||||||
{ $values { "cfg" cfg } { "cfg'" cfg } }
|
{ $values { "cfg" cfg } }
|
||||||
{ $description "Computes predecessor info for the cfg unless it already is up-to-date." } ;
|
{ $description "Computes predecessor info for the cfg unless it already is up-to-date." } ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008, 2009 Slava Pestov.
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel accessors combinators fry sequences assocs compiler.cfg.rpo
|
USING: kernel accessors fry sequences assocs compiler.cfg.rpo
|
||||||
compiler.cfg.instructions compiler.cfg.utilities ;
|
compiler.cfg.instructions compiler.cfg.utilities ;
|
||||||
IN: compiler.cfg.predecessors
|
IN: compiler.cfg.predecessors
|
||||||
|
|
||||||
|
@ -18,16 +18,13 @@ IN: compiler.cfg.predecessors
|
||||||
: update-phis ( bb -- )
|
: update-phis ( bb -- )
|
||||||
dup [ update-phi ] with each-phi ;
|
dup [ update-phi ] with each-phi ;
|
||||||
|
|
||||||
: compute-predecessors ( cfg -- cfg' )
|
: compute-predecessors ( cfg -- )
|
||||||
{
|
[ [ V{ } clone >>predecessors drop ] each-basic-block ]
|
||||||
[ [ V{ } clone >>predecessors drop ] each-basic-block ]
|
[ [ update-predecessors ] each-basic-block ]
|
||||||
[ [ update-predecessors ] each-basic-block ]
|
[ [ update-phis ] each-basic-block ] tri ;
|
||||||
[ [ update-phis ] each-basic-block ]
|
|
||||||
[ ]
|
|
||||||
} cleave ;
|
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: needs-predecessors ( cfg -- cfg' )
|
: needs-predecessors ( cfg -- )
|
||||||
dup predecessors-valid?>>
|
dup predecessors-valid?>> [ drop ]
|
||||||
[ compute-predecessors t >>predecessors-valid? ] unless ;
|
[ t >>predecessors-valid? compute-predecessors ] if ;
|
||||||
|
|
|
@ -18,9 +18,8 @@ IN: compiler.cfg.representations
|
||||||
|
|
||||||
: select-representations ( cfg -- cfg' )
|
: select-representations ( cfg -- cfg' )
|
||||||
needs-loops
|
needs-loops
|
||||||
needs-predecessors
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
[ needs-predecessors ]
|
||||||
[ compute-components ]
|
[ compute-components ]
|
||||||
[ compute-possibilities ]
|
[ compute-possibilities ]
|
||||||
[ compute-representations ]
|
[ compute-representations ]
|
||||||
|
|
|
@ -70,8 +70,6 @@ SYMBOLS: edge-copies phi-copies ;
|
||||||
tri ;
|
tri ;
|
||||||
|
|
||||||
: construct-cssa ( cfg -- )
|
: construct-cssa ( cfg -- )
|
||||||
needs-predecessors
|
[ needs-predecessors ]
|
||||||
|
[ [ convert-phis ] each-basic-block ]
|
||||||
dup [ convert-phis ] each-basic-block
|
[ cfg-changed ] tri ;
|
||||||
|
|
||||||
cfg-changed ;
|
|
||||||
|
|
|
@ -52,8 +52,7 @@ ERROR: bad-peek dst loc ;
|
||||||
[ predecessors>> ] keep '[ _ visit-edge ] each ;
|
[ predecessors>> ] keep '[ _ visit-edge ] each ;
|
||||||
|
|
||||||
: finalize-stack-shuffling ( cfg -- cfg' )
|
: finalize-stack-shuffling ( cfg -- cfg' )
|
||||||
needs-predecessors
|
dup
|
||||||
|
[ needs-predecessors ]
|
||||||
dup [ visit-block ] each-basic-block
|
[ [ visit-block ] each-basic-block ]
|
||||||
|
[ cfg-changed ] tri ;
|
||||||
dup cfg-changed ;
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ USING: namespaces arrays assocs hashtables kernel accessors fry
|
||||||
grouping sorting sets sequences locals
|
grouping sorting sets sequences locals
|
||||||
cpu.architecture
|
cpu.architecture
|
||||||
sequences.deep
|
sequences.deep
|
||||||
|
combinators
|
||||||
compiler.cfg
|
compiler.cfg
|
||||||
compiler.cfg.rpo
|
compiler.cfg.rpo
|
||||||
compiler.cfg.def-use
|
compiler.cfg.def-use
|
||||||
|
@ -118,7 +119,10 @@ M: insn gcse
|
||||||
[ gcse-step ] simple-optimization ;
|
[ gcse-step ] simple-optimization ;
|
||||||
|
|
||||||
: value-numbering ( cfg -- cfg )
|
: value-numbering ( cfg -- cfg )
|
||||||
needs-predecessors
|
dup {
|
||||||
dup determine-value-numbers
|
[ needs-predecessors ]
|
||||||
dup eliminate-common-subexpressions
|
[ determine-value-numbers ]
|
||||||
[ cfg-changed ] [ predecessors-changed ] bi ;
|
[ eliminate-common-subexpressions ]
|
||||||
|
[ cfg-changed ]
|
||||||
|
[ predecessors-changed ]
|
||||||
|
} cleave ;
|
||||||
|
|
|
@ -90,7 +90,7 @@ IN: compiler.graphviz
|
||||||
: dom-trees ( cfgs -- )
|
: dom-trees ( cfgs -- )
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
needs-dominance drop
|
needs-dominance
|
||||||
dom-childrens get [
|
dom-childrens get [
|
||||||
[
|
[
|
||||||
bb-edge,
|
bb-edge,
|
||||||
|
@ -125,7 +125,7 @@ SYMBOL: vertex-names
|
||||||
{
|
{
|
||||||
[ { } call-graph-edge, ]
|
[ { } call-graph-edge, ]
|
||||||
[ [ vertex-name ] [ label>> loop?>> { "shape=box" } { } ? ] bi node-style, ]
|
[ [ vertex-name ] [ label>> loop?>> { "shape=box" } { } ? ] bi node-style, ]
|
||||||
[ [ vertex-name ] [ calls>> ] bi (call-graph-back-edges) ]
|
[ [ vertex-name ] [ calls>> ] bi (call-graph-back-edges) ]
|
||||||
[ [ vertex-name ] [ children>> ] bi (call-graph-edges) ]
|
[ [ vertex-name ] [ children>> ] bi (call-graph-edges) ]
|
||||||
} cleave
|
} cleave
|
||||||
] with each ;
|
] with each ;
|
||||||
|
|
Loading…
Reference in New Issue