factor/basis/compiler/cfg/coalescing/coalescing.factor

63 lines
1.7 KiB
Factor
Raw Normal View History

! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs fry kernel locals math math.order
sequences namespaces sets
compiler.cfg.rpo
compiler.cfg.def-use
compiler.cfg.utilities
compiler.cfg.dominance
compiler.cfg.instructions
compiler.cfg.critical-edges
compiler.cfg.coalescing.state
compiler.cfg.coalescing.forest
compiler.cfg.coalescing.copies
compiler.cfg.coalescing.renaming
compiler.cfg.coalescing.live-ranges
compiler.cfg.coalescing.process-blocks ;
IN: compiler.cfg.coalescing
! Fast Copy Coalescing and Live-Range Identification
! http://www.cs.ucsd.edu/classes/sp02/cse231/kenpldi.pdf
! Dominance, liveness and def-use need to be computed
: process-blocks ( cfg -- )
[ [ process-block ] if-has-phis ] each-basic-block ;
SYMBOL: seen
:: visit-renaming ( dst assoc src bb -- )
src seen get key? [
src dst bb waiting-for push-at
src assoc delete-at
] [ src seen get conjoin ] if ;
:: break-interferences ( -- )
V{ } clone seen set
renaming-sets get [| dst assoc |
assoc [| src bb |
src seen get key?
[ dst assoc src bb visit-renaming ]
[ src seen get conjoin ]
if
] assoc-each
] assoc-each ;
: remove-phis-from-block ( bb -- )
instructions>> [ ##phi? not ] filter-here ;
: remove-phis ( cfg -- )
[ [ remove-phis-from-block ] if-has-phis ] each-basic-block ;
: coalesce ( cfg -- cfg' )
init-coalescing
dup split-critical-edges
dup compute-def-use
dup compute-dominance
dup compute-dfs
dup compute-live-ranges
dup process-blocks
break-interferences
dup perform-renaming
2009-07-27 20:24:13 -04:00
insert-copies
dup remove-phis ;