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

55 lines
1.4 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.
2011-01-17 18:16:17 -05:00
USING: accessors assocs kernel locals fry make namespaces
sequences cpu.architecture
compiler.cfg
compiler.cfg.rpo
compiler.cfg.utilities
2011-01-17 18:16:17 -05:00
compiler.cfg.predecessors
compiler.cfg.registers
compiler.cfg.instructions ;
2011-01-17 18:16:17 -05:00
FROM: assocs => change-at ;
IN: compiler.cfg.ssa.cssa
! Convert SSA to conventional SSA. This pass runs after representation
! selection, so it must keep track of representations when introducing
! new values.
2011-01-17 18:16:17 -05:00
SYMBOL: copies
2011-01-17 18:16:17 -05:00
: init-copies ( bb -- )
predecessors>> [ V{ } clone ] H{ } map>assoc copies set ;
2011-01-17 18:16:17 -05:00
:: convert-operand ( src pred rep -- dst )
rep next-vreg-rep :> dst
{ dst src } pred copies get at push
dst ;
:: convert-phi ( insn preds -- )
insn dst>> rep-of :> rep
insn inputs>> :> inputs
preds [| pred |
pred inputs [ pred rep convert-operand ] change-at
] each ;
: insert-edge-copies ( from to copies -- )
[ ##parallel-copy ##branch ] { } make insert-basic-block ;
: insert-copies ( bb -- )
[ copies get ] dip '[
[ drop ] [ [ _ ] dip insert-edge-copies ] if-empty
] assoc-each ;
: convert-phis ( bb -- )
[ init-copies ]
[ dup predecessors>> '[ _ convert-phi ] each-phi ]
[ insert-copies ]
tri ;
: construct-cssa ( cfg -- )
2011-01-17 18:16:17 -05:00
needs-predecessors
dup [ convert-phis ] each-basic-block
cfg-changed drop ;