factor/basis/compiler/cfg/def-use/def-use.factor

123 lines
3.1 KiB
Factor

! Copyright (C) 2008, 2011 Slava Pestov, Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs combinators compiler.cfg
compiler.cfg.instructions compiler.cfg.instructions.syntax
compiler.cfg.rpo compiler.units fry generic kernel namespaces
quotations sequences sequences.generalizations sets slots words ;
IN: compiler.cfg.def-use
! Utilities for iterating over instruction operands
GENERIC: defs-vregs ( insn -- seq )
GENERIC: temp-vregs ( insn -- seq )
GENERIC: uses-vregs ( insn -- seq )
M: insn defs-vregs drop { } ;
M: insn temp-vregs drop { } ;
M: insn uses-vregs drop { } ;
CONSTANT: special-vreg-insns {
##parallel-copy
##phi
##alien-invoke
##alien-indirect
##alien-assembly
##callback-inputs
##callback-outputs
}
! Special defs-vregs methods
M: ##parallel-copy defs-vregs values>> [ first ] map ;
M: ##phi defs-vregs dst>> 1array ;
M: alien-call-insn defs-vregs
reg-outputs>> [ first ] map ;
M: ##callback-inputs defs-vregs
[ reg-outputs>> ] [ stack-outputs>> ] bi append [ first ] map ;
M: ##callback-outputs defs-vregs drop { } ;
! Special uses-vregs methods
M: ##parallel-copy uses-vregs values>> [ second ] map ;
M: ##phi uses-vregs inputs>> values ;
M: alien-call-insn uses-vregs
[ reg-inputs>> ] [ stack-inputs>> ] bi append [ first ] map ;
M: ##alien-indirect uses-vregs
[ call-next-method ] [ src>> ] bi prefix ;
M: ##callback-inputs uses-vregs
drop { } ;
M: ##callback-outputs uses-vregs
reg-inputs>> [ first ] map ;
! Generate defs-vregs, uses-vregs and temp-vregs for everything
! else
<PRIVATE
: slot-array-quot ( slots -- quot )
[ reader-word 1quotation ] map dup length {
{ 0 [ drop [ drop f ] ] }
{ 1 [ first [ 1array ] compose ] }
{ 2 [ first2 '[ _ _ bi 2array ] ] }
[ '[ _ cleave _ narray ] ]
} case ;
: define-vregs-method ( insn slots word -- )
[ [ drop ] ] dip '[
[ _ create-method ]
[ [ name>> ] map slot-array-quot ] bi*
define
] if-empty ; inline
: define-defs-vregs-method ( insn -- )
dup insn-def-slots \ defs-vregs define-vregs-method ;
: define-uses-vregs-method ( insn -- )
dup insn-use-slots \ uses-vregs define-vregs-method ;
: define-temp-vregs-method ( insn -- )
dup insn-temp-slots \ temp-vregs define-vregs-method ;
PRIVATE>
[
insn-classes get
[ special-vreg-insns diff [ define-defs-vregs-method ] each ]
[ special-vreg-insns diff [ define-uses-vregs-method ] each ]
[ [ define-temp-vregs-method ] each ]
tri
] with-compilation-unit
! Computing vreg -> insn -> bb mapping
SYMBOLS: defs insns ;
: def-of ( vreg -- node ) defs get at ;
: insn-of ( vreg -- insn ) insns get at ;
: set-def-of ( obj insn assoc -- )
swap defs-vregs [ swap set-at ] 2with each ;
: compute-defs ( cfg -- )
H{ } clone [
'[
[ basic-block get ] dip [
_ set-def-of
] with each
] simple-analysis
] keep defs set ;
: compute-insns ( cfg -- )
H{ } clone [
'[
[
dup _ set-def-of
] each
] simple-analysis
] keep insns set ;