compiler: use hash-sets to track visited sets.
parent
f06bfef276
commit
bf35114fec
|
@ -27,18 +27,18 @@ SYMBOLS: visited active ;
|
||||||
DEFER: find-loop-headers
|
DEFER: find-loop-headers
|
||||||
|
|
||||||
: visit-edge ( from to -- )
|
: visit-edge ( from to -- )
|
||||||
dup active get key?
|
dup active get in?
|
||||||
[ record-back-edge ]
|
[ record-back-edge ]
|
||||||
[ nip find-loop-headers ]
|
[ nip find-loop-headers ]
|
||||||
if ;
|
if ;
|
||||||
|
|
||||||
: find-loop-headers ( bb -- )
|
: find-loop-headers ( bb -- )
|
||||||
dup visited get key? [ drop ] [
|
dup visited get in? [ drop ] [
|
||||||
{
|
{
|
||||||
[ visited get conjoin ]
|
[ visited get adjoin ]
|
||||||
[ active get conjoin ]
|
[ active get adjoin ]
|
||||||
[ dup successors>> [ visit-edge ] with each ]
|
[ dup successors>> [ visit-edge ] with each ]
|
||||||
[ active get delete-at ]
|
[ active get delete ]
|
||||||
} cleave
|
} cleave
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
|
@ -70,8 +70,8 @@ SYMBOL: loop-nesting
|
||||||
: detect-loops ( cfg -- cfg' )
|
: detect-loops ( cfg -- cfg' )
|
||||||
needs-predecessors
|
needs-predecessors
|
||||||
H{ } clone loops set
|
H{ } clone loops set
|
||||||
H{ } clone visited set
|
HS{ } clone visited set
|
||||||
H{ } 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 ;
|
dup entry>> find-loop-headers process-loop-headers compute-loop-nesting ;
|
||||||
|
|
||||||
|
|
|
@ -5,16 +5,14 @@ assocs fry compiler.cfg compiler.cfg.instructions ;
|
||||||
FROM: namespaces => set ;
|
FROM: namespaces => set ;
|
||||||
IN: compiler.cfg.rpo
|
IN: compiler.cfg.rpo
|
||||||
|
|
||||||
SYMBOL: visited
|
: post-order-traversal ( visited bb -- visited' )
|
||||||
|
dup pick in? [ drop ] [
|
||||||
: post-order-traversal ( bb -- )
|
dup pick adjoin
|
||||||
dup visited get key? [ drop ] [
|
|
||||||
dup visited get conjoin
|
|
||||||
[
|
[
|
||||||
successors>> <reversed>
|
successors>> <reversed>
|
||||||
[ post-order-traversal ] each
|
[ post-order-traversal ] each
|
||||||
] [ , ] bi
|
] [ , ] bi
|
||||||
] if ;
|
] if ; inline recursive
|
||||||
|
|
||||||
: number-blocks ( blocks -- )
|
: number-blocks ( blocks -- )
|
||||||
dup length iota <reversed>
|
dup length iota <reversed>
|
||||||
|
@ -23,8 +21,8 @@ SYMBOL: visited
|
||||||
: post-order ( cfg -- blocks )
|
: post-order ( cfg -- blocks )
|
||||||
dup post-order>> [ ] [
|
dup post-order>> [ ] [
|
||||||
[
|
[
|
||||||
H{ } clone visited set
|
HS{ } clone over entry>>
|
||||||
dup entry>> post-order-traversal
|
post-order-traversal drop
|
||||||
] { } make dup number-blocks
|
] { } make dup number-blocks
|
||||||
>>post-order post-order>>
|
>>post-order post-order>>
|
||||||
] ?if ;
|
] ?if ;
|
||||||
|
|
|
@ -18,18 +18,16 @@ IN: compiler.cfg.utilities
|
||||||
[ first ##branch? ]
|
[ first ##branch? ]
|
||||||
} 1&& ;
|
} 1&& ;
|
||||||
|
|
||||||
SYMBOL: visited
|
: (skip-empty-blocks) ( visited bb -- visited' bb' )
|
||||||
|
dup pick in? [
|
||||||
: (skip-empty-blocks) ( bb -- bb' )
|
|
||||||
dup visited get key? [
|
|
||||||
dup empty-block? [
|
dup empty-block? [
|
||||||
dup visited get conjoin
|
dup pick adjoin
|
||||||
successors>> first (skip-empty-blocks)
|
successors>> first (skip-empty-blocks)
|
||||||
] when
|
] when
|
||||||
] unless ;
|
] unless ; inline recursive
|
||||||
|
|
||||||
: skip-empty-blocks ( bb -- bb' )
|
: skip-empty-blocks ( bb -- bb' )
|
||||||
H{ } clone visited [ (skip-empty-blocks) ] with-variable ;
|
[ HS{ } clone ] dip (skip-empty-blocks) nip ;
|
||||||
|
|
||||||
:: update-predecessors ( from to bb -- )
|
:: update-predecessors ( from to bb -- )
|
||||||
! Whenever 'from' appears in the list of predecessors of 'to'
|
! Whenever 'from' appears in the list of predecessors of 'to'
|
||||||
|
|
|
@ -15,15 +15,15 @@ TUPLE: real-usage value node ;
|
||||||
SYMBOLS: visited accum ;
|
SYMBOLS: visited accum ;
|
||||||
|
|
||||||
: if-not-visited ( value quot -- )
|
: if-not-visited ( value quot -- )
|
||||||
over visited get key?
|
over visited get in?
|
||||||
[ 2drop ] [ over visited get conjoin call ] if ; inline
|
[ 2drop ] [ over visited get adjoin call ] if ; inline
|
||||||
|
|
||||||
: with-simplified-def-use ( quot -- real-usages )
|
: with-simplified-def-use ( quot -- real-usages )
|
||||||
[
|
[
|
||||||
H{ } clone visited set
|
HS{ } clone visited set
|
||||||
H{ } clone accum set
|
HS{ } clone accum set
|
||||||
call
|
call
|
||||||
accum get keys
|
accum get members
|
||||||
] with-scope ; inline
|
] with-scope ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
@ -54,7 +54,7 @@ M: #phi actually-defined-by*
|
||||||
] with each ;
|
] with each ;
|
||||||
|
|
||||||
M: node actually-defined-by*
|
M: node actually-defined-by*
|
||||||
real-usage boa accum get conjoin ;
|
real-usage boa accum get adjoin ;
|
||||||
|
|
||||||
: actually-defined-by ( value -- real-usages )
|
: actually-defined-by ( value -- real-usages )
|
||||||
[ (actually-defined-by) ] with-simplified-def-use ;
|
[ (actually-defined-by) ] with-simplified-def-use ;
|
||||||
|
@ -88,7 +88,7 @@ M: #phi actually-used-by*
|
||||||
M: #recursive actually-used-by* 2drop ;
|
M: #recursive actually-used-by* 2drop ;
|
||||||
|
|
||||||
M: node actually-used-by*
|
M: node actually-used-by*
|
||||||
real-usage boa accum get conjoin ;
|
real-usage boa accum get adjoin ;
|
||||||
|
|
||||||
: actually-used-by ( value -- real-usages )
|
: actually-used-by ( value -- real-usages )
|
||||||
[ (actually-used-by) ] with-simplified-def-use ;
|
[ (actually-used-by) ] with-simplified-def-use ;
|
||||||
|
|
Loading…
Reference in New Issue