1 ! Copyright (C) 2008, 2011 Slava Pestov, Daniel Ehrenberg.
2 ! See https://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 generic kernel namespaces
6 quotations sequences sequences.generalizations sets slots words ;
7 IN: compiler.cfg.def-use
9 ! Utilities for iterating over instruction operands
11 GENERIC: defs-vregs ( insn -- seq )
12 GENERIC: temp-vregs ( insn -- seq )
13 GENERIC: uses-vregs ( insn -- seq )
15 M: insn defs-vregs drop { } ;
16 M: insn temp-vregs drop { } ;
17 M: insn uses-vregs drop { } ;
19 CONSTANT: special-vreg-insns {
29 ! Special defs-vregs methods
30 M: ##parallel-copy defs-vregs values>> [ first ] map ;
32 M: ##phi defs-vregs dst>> 1array ;
34 M: alien-call-insn defs-vregs
35 reg-outputs>> [ first ] map ;
37 M: ##callback-inputs defs-vregs
38 [ reg-outputs>> ] [ stack-outputs>> ] bi append [ first ] map ;
40 M: ##callback-outputs defs-vregs drop { } ;
42 ! Special uses-vregs methods
43 M: ##parallel-copy uses-vregs values>> [ second ] map ;
45 M: ##phi uses-vregs inputs>> values ;
47 M: alien-call-insn uses-vregs
48 [ reg-inputs>> ] [ stack-inputs>> ] bi append [ first ] map ;
50 M: ##alien-indirect uses-vregs
51 [ call-next-method ] [ src>> ] bi prefix ;
53 M: ##callback-inputs uses-vregs
56 M: ##callback-outputs uses-vregs
57 reg-inputs>> [ first ] map ;
59 ! Generate defs-vregs, uses-vregs and temp-vregs for everything
63 : slot-array-quot ( slots -- quot )
64 [ reader-word 1quotation ] map dup length {
65 { 0 [ drop [ drop f ] ] }
66 { 1 [ first [ 1array ] compose ] }
67 { 2 [ first2 '[ _ _ bi 2array ] ] }
68 [ '[ _ cleave _ narray ] ]
71 : define-vregs-method ( insn slots word -- )
74 [ [ name>> ] map slot-array-quot ] bi*
78 : define-defs-vregs-method ( insn -- )
79 dup insn-def-slots \ defs-vregs define-vregs-method ;
81 : define-uses-vregs-method ( insn -- )
82 dup insn-use-slots \ uses-vregs define-vregs-method ;
84 : define-temp-vregs-method ( insn -- )
85 dup insn-temp-slots \ temp-vregs define-vregs-method ;
91 [ special-vreg-insns diff [ define-defs-vregs-method ] each ]
92 [ special-vreg-insns diff [ define-uses-vregs-method ] each ]
93 [ [ define-temp-vregs-method ] each ]
95 ] with-compilation-unit
97 ! Computing vreg -> insn -> bb mapping
100 : def-of ( vreg -- node ) defs get at ;
101 : insn-of ( vreg -- insn ) insns get at ;
103 : set-def-of ( obj insn assoc -- )
104 swap defs-vregs [ swap set-at ] 2with each ;
106 : compute-defs ( cfg -- )
109 [ basic-block get ] dip [
113 ] keep defs namespaces:set ;
115 : compute-insns ( cfg -- )
122 ] keep insns namespaces:set ;