1 ! Copyright (C) 2009, 2011 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs compiler.cfg compiler.cfg.instructions
4 compiler.cfg.predecessors compiler.cfg.registers
5 compiler.cfg.rpo compiler.cfg.utilities fry kernel locals make
7 IN: compiler.cfg.ssa.cssa
9 SYMBOLS: edge-copies phi-copies ;
11 : init-copies ( bb -- )
12 V{ } clone phi-copies set
13 predecessors>> [ V{ } clone ] H{ } map>assoc edge-copies set ;
15 :: convert-operand ( src pred rep -- dst )
16 rep next-vreg-rep :> dst
17 { dst src } pred edge-copies get at push
20 :: convert-phi ( insn preds -- )
23 insn inputs>> :> inputs
24 rep next-vreg-rep :> dst'
26 { dst dst' } phi-copies get push
30 pred inputs [ pred rep convert-operand ] change-at
33 : insert-edge-copies ( from to copies -- )
34 [ ##parallel-copy, ##branch, ] { } make insert-basic-block ;
36 : insert-all-edge-copies ( bb -- )
37 [ edge-copies get ] dip '[
38 [ drop ] [ [ _ ] dip insert-edge-copies ] if-empty
41 : phi-copy-insn ( copies -- insn )
42 f \ ##parallel-copy boa ;
44 : end-of-phis ( insns -- i )
45 [ [ ##phi? not ] find drop ] [ length ] bi or ;
47 : insert-phi-copies ( bb -- )
50 [ drop phi-copies get phi-copy-insn ]
53 ] change-instructions drop
56 : insert-copies ( bb -- )
57 [ insert-all-edge-copies ] [ insert-phi-copies ] bi ;
59 : convert-phis ( bb -- )
61 [ dup predecessors>> '[ _ convert-phi ] each-phi ]
65 : construct-cssa ( cfg -- )
66 [ needs-predecessors ]
67 [ [ convert-phis ] each-basic-block ]