1 ! Copyright (C) 2008, 2011 Slava Pestov, Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs combinators compiler.cfg
4 compiler.cfg.instructions compiler.cfg.instructions.syntax
5 compiler.cfg.rpo compiler.units fry generic kernel namespaces
6 quotations sequences sequences.generalizations sets slots words ;
7 FROM: namespaces => set ;
8 IN: compiler.cfg.def-use
10 ! Utilities for iterating over instruction operands
12 GENERIC: defs-vregs ( insn -- seq )
13 GENERIC: temp-vregs ( insn -- seq )
14 GENERIC: uses-vregs ( insn -- seq )
16 M: insn defs-vregs drop { } ;
17 M: insn temp-vregs drop { } ;
18 M: insn uses-vregs drop { } ;
20 CONSTANT: special-vreg-insns {
30 ! Special defs-vregs methods
31 M: ##parallel-copy defs-vregs values>> [ first ] map ;
33 M: ##phi defs-vregs dst>> 1array ;
35 M: alien-call-insn defs-vregs
36 reg-outputs>> [ first ] map ;
38 M: ##callback-inputs defs-vregs
39 [ reg-outputs>> ] [ stack-outputs>> ] bi append [ first ] map ;
41 M: ##callback-outputs defs-vregs drop { } ;
43 ! Special uses-vregs methods
44 M: ##parallel-copy uses-vregs values>> [ second ] map ;
46 M: ##phi uses-vregs inputs>> values ;
48 M: alien-call-insn uses-vregs
49 [ reg-inputs>> ] [ stack-inputs>> ] bi append [ first ] map ;
51 M: ##alien-indirect uses-vregs
52 [ call-next-method ] [ src>> ] bi prefix ;
54 M: ##callback-inputs uses-vregs
57 M: ##callback-outputs uses-vregs
58 reg-inputs>> [ first ] map ;
60 ! Generate defs-vregs, uses-vregs and temp-vregs for everything
64 : slot-array-quot ( slots -- quot )
65 [ reader-word 1quotation ] map dup length {
66 { 0 [ drop [ drop f ] ] }
67 { 1 [ first [ 1array ] compose ] }
68 { 2 [ first2 '[ _ _ bi 2array ] ] }
69 [ '[ _ cleave _ narray ] ]
72 : define-vregs-method ( insn slots word -- )
75 [ [ name>> ] map slot-array-quot ] bi*
79 : define-defs-vregs-method ( insn -- )
80 dup insn-def-slots \ defs-vregs define-vregs-method ;
82 : define-uses-vregs-method ( insn -- )
83 dup insn-use-slots \ uses-vregs define-vregs-method ;
85 : define-temp-vregs-method ( insn -- )
86 dup insn-temp-slots \ temp-vregs define-vregs-method ;
92 [ special-vreg-insns diff [ define-defs-vregs-method ] each ]
93 [ special-vreg-insns diff [ define-uses-vregs-method ] each ]
94 [ [ define-temp-vregs-method ] each ]
96 ] with-compilation-unit
98 ! Computing vreg -> insn -> bb mapping
101 : def-of ( vreg -- node ) defs get at ;
102 : insn-of ( vreg -- insn ) insns get at ;
104 : set-def-of ( obj insn assoc -- )
105 swap defs-vregs [ swap set-at ] 2with each ;
107 : compute-defs ( cfg -- )
110 [ basic-block get ] dip [
116 : compute-insns ( cfg -- )