48 lines
1.2 KiB
Factor
48 lines
1.2 KiB
Factor
! Copyright (C) 2008 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: kernel accessors namespaces assocs sequences sets fry ;
|
|
IN: compiler.cfg
|
|
|
|
! The id is a globally unique id used for fast hashcode* and
|
|
! equal? on basic blocks. The number is assigned by
|
|
! linearization.
|
|
TUPLE: basic-block < identity-tuple
|
|
id
|
|
number
|
|
instructions
|
|
successors
|
|
predecessors
|
|
stack-frame ;
|
|
|
|
SYMBOL: next-block-id
|
|
|
|
: <basic-block> ( -- basic-block )
|
|
basic-block new
|
|
next-block-id counter >>id
|
|
V{ } clone >>instructions
|
|
V{ } clone >>successors
|
|
V{ } clone >>predecessors ;
|
|
|
|
M: basic-block hashcode* id>> nip ;
|
|
|
|
! Utilities
|
|
SYMBOL: visited-blocks
|
|
|
|
: visit-block ( basic-block quot -- )
|
|
over visited-blocks get 2dup key?
|
|
[ 2drop 2drop ] [ conjoin call ] if ; inline
|
|
|
|
: (each-block) ( basic-block quot -- )
|
|
'[
|
|
,
|
|
[ call ]
|
|
[ [ successors>> ] dip '[ , (each-block) ] each ]
|
|
2bi
|
|
] visit-block ; inline
|
|
|
|
: each-block ( basic-block quot -- )
|
|
H{ } clone visited-blocks [ (each-block) ] with-variable ; inline
|
|
|
|
: copy-at ( from to assoc -- )
|
|
3dup nip at* [ -rot set-at drop ] [ 2drop 2drop ] if ; inline
|