1 ! Copyright (C) 2008, 2011 Slava Pestov, Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs arrays classes combinators
4 compiler.units fry generalizations sequences.generalizations
5 generic kernel locals namespaces quotations sequences sets slots
6 words compiler.cfg.instructions compiler.cfg.instructions.syntax
7 compiler.cfg.rpo compiler.cfg ;
8 FROM: namespaces => set ;
9 FROM: sets => members ;
10 IN: compiler.cfg.def-use
12 ! Utilities for iterating over instruction operands
15 GENERIC: defs-vregs ( insn -- seq )
16 GENERIC: temp-vregs ( insn -- seq )
17 GENERIC: uses-vregs ( insn -- seq )
19 M: insn defs-vregs drop { } ;
20 M: insn temp-vregs drop { } ;
21 M: insn uses-vregs drop { } ;
23 ! Instructions with unusual operands, also see these passes
24 ! for special behavior:
25 ! - compiler.cfg.renaming.functor
26 ! - compiler.cfg.representations.preferred
27 CONSTANT: special-vreg-insns {
37 ! Special defs-vregs methods
38 M: ##parallel-copy defs-vregs values>> [ first ] map ;
40 M: ##phi defs-vregs dst>> 1array ;
42 M: alien-call-insn defs-vregs
43 reg-outputs>> [ first ] map ;
45 M: ##callback-inputs defs-vregs
46 [ reg-outputs>> ] [ stack-outputs>> ] bi append [ first ] map ;
48 M: ##callback-outputs defs-vregs drop { } ;
50 ! Special uses-vregs methods
51 M: ##parallel-copy uses-vregs values>> [ second ] map ;
53 M: ##phi uses-vregs inputs>> values ;
55 M: alien-call-insn uses-vregs
56 [ reg-inputs>> ] [ stack-inputs>> ] bi append [ first ] map ;
58 M: ##alien-indirect uses-vregs
59 [ call-next-method ] [ src>> ] bi prefix ;
61 M: ##callback-inputs uses-vregs
64 M: ##callback-outputs uses-vregs
65 reg-inputs>> [ first ] map ;
67 ! Generate defs-vregs, uses-vregs and temp-vregs for everything
71 : slot-array-quot ( slots -- quot )
72 [ reader-word 1quotation ] map dup length {
73 { 0 [ drop [ drop f ] ] }
74 { 1 [ first [ 1array ] compose ] }
75 { 2 [ first2 '[ _ _ bi 2array ] ] }
76 [ '[ _ cleave _ narray ] ]
79 : define-vregs-method ( insn slots word -- )
82 [ [ name>> ] map slot-array-quot ] bi*
86 : define-defs-vregs-method ( insn -- )
87 dup insn-def-slots \ defs-vregs define-vregs-method ;
89 : define-uses-vregs-method ( insn -- )
90 dup insn-use-slots \ uses-vregs define-vregs-method ;
92 : define-temp-vregs-method ( insn -- )
93 dup insn-temp-slots \ temp-vregs define-vregs-method ;
99 [ special-vreg-insns diff [ define-defs-vregs-method ] each ]
100 [ special-vreg-insns diff [ define-uses-vregs-method ] each ]
101 [ [ define-temp-vregs-method ] each ]
103 ] with-compilation-unit
105 ! Computing vreg -> insn -> bb mapping
106 SYMBOLS: defs insns ;
108 : def-of ( vreg -- node ) defs get at ;
109 : insn-of ( vreg -- insn ) insns get at ;
111 : set-def-of ( obj insn assoc -- )
112 swap defs-vregs [ swap set-at ] 2with each ;
114 : compute-defs ( cfg -- )
117 [ basic-block get ] dip [
123 : compute-insns ( cfg -- )