factor/basis/compiler/cfg/ssa/cssa/cssa.factor

69 lines
1.8 KiB
Factor
Raw Normal View History

2011-01-17 18:16:17 -05:00
! Copyright (C) 2009, 2011 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2014-12-13 19:10:21 -05:00
USING: accessors assocs compiler.cfg compiler.cfg.instructions
compiler.cfg.predecessors compiler.cfg.registers
compiler.cfg.rpo compiler.cfg.utilities fry kernel locals make
namespaces sequences ;
IN: compiler.cfg.ssa.cssa
SYMBOLS: edge-copies phi-copies ;
2011-01-17 18:16:17 -05:00
: init-copies ( bb -- )
V{ } clone phi-copies set
predecessors>> [ V{ } clone ] H{ } map>assoc edge-copies set ;
2011-01-17 18:16:17 -05:00
:: convert-operand ( src pred rep -- dst )
rep next-vreg-rep :> dst
{ dst src } pred edge-copies get at push
2011-01-17 18:16:17 -05:00
dst ;
:: convert-phi ( insn preds -- )
insn dst>> :> dst
dst rep-of :> rep
2011-01-17 18:16:17 -05:00
insn inputs>> :> inputs
rep next-vreg-rep :> dst'
{ dst dst' } phi-copies get push
dst' insn dst<<
2011-01-17 18:16:17 -05:00
preds [| pred |
pred inputs [ pred rep convert-operand ] change-at
] each ;
: insert-edge-copies ( from to copies -- )
[ ##parallel-copy, ##branch, ] { } make insert-basic-block ;
2011-01-17 18:16:17 -05:00
: insert-all-edge-copies ( bb -- )
[ edge-copies get ] dip '[
2011-01-17 18:16:17 -05:00
[ drop ] [ [ _ ] dip insert-edge-copies ] if-empty
] assoc-each ;
: phi-copy-insn ( copies -- insn )
f \ ##parallel-copy boa ;
: end-of-phis ( insns -- i )
[ [ ##phi? not ] find drop ] [ length ] bi or ;
: insert-phi-copies ( bb -- )
[
[
[ drop phi-copies get phi-copy-insn ]
[ end-of-phis ]
[ ] tri insert-nth
] change-instructions drop
] if-has-phis ;
: insert-copies ( bb -- )
[ insert-all-edge-copies ] [ insert-phi-copies ] bi ;
2011-01-17 18:16:17 -05:00
: convert-phis ( bb -- )
[ init-copies ]
[ dup predecessors>> '[ _ convert-phi ] each-phi ]
[ insert-copies ]
tri ;
: construct-cssa ( cfg -- )
[ needs-predecessors ]
[ [ convert-phis ] each-basic-block ]
[ cfg-changed ] tri ;