1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: assocs compiler.cfg compiler.cfg.def-use
4 compiler.cfg.dominance compiler.cfg.instructions
5 compiler.cfg.liveness compiler.cfg.rpo kernel math namespaces
7 IN: compiler.cfg.ssa.interference.live-ranges
11 SYMBOLS: local-def-indices local-kill-indices ;
13 : record-defs ( n insn -- )
14 defs-vregs [ local-def-indices get set-at ] with each ;
16 : record-uses ( n insn -- )
17 dup uses-vregs [ 2drop ] [
19 [ [ first local-kill-indices get set-at ] [ rest-slice ] 2bi ] unless
20 [ 1 + ] dip [ local-kill-indices get set-at ] with each
23 GENERIC: record-insn ( n insn -- )
28 M: ##parallel-copy record-insn
31 [ uses-vregs [ local-kill-indices get set-at ] with each ]
34 M: vreg-insn record-insn
35 [ 2 * ] dip [ record-defs ] [ record-uses ] 2bi ;
40 SYMBOLS: def-indices kill-indices ;
42 : compute-local-live-ranges ( insns -- )
43 H{ } clone local-def-indices set
44 H{ } clone local-kill-indices set
45 [ swap record-insn ] each-index
46 local-def-indices get basic-block get def-indices get set-at
47 local-kill-indices get basic-block get kill-indices get set-at ;
51 : compute-live-ranges ( cfg -- )
52 H{ } clone def-indices set
53 H{ } clone kill-indices set
55 [ [ compute-local-live-ranges ] simple-analysis ] bi ;
57 : def-index ( vreg bb -- n )
58 def-indices get at at ;
60 ERROR: bad-kill-index vreg bb ;
62 : kill-index ( vreg bb -- n )
63 2dup live-out? [ 2drop 1/0. ] [
64 2dup kill-indices get at at* [ 2nip ] [
66 [ bad-kill-index ] [ 2drop -1/0. ] if