compiler.cfg.alias-analysis: optimize ##vm-field-ptr and ##alien-global instructions, and optimize out ##compare between values of different alias classes; this optimizes '[ [ >float ] bi@ [ + ] [ - ] 2bi eq? ]' down to an o-op and removes boxing from '[ [ >float ] bi@ [ + ] [ - ] 2bi = ]'
parent
c3d81cefe9
commit
31f39ce32f
|
@ -1,10 +1,17 @@
|
||||||
! Copyright (C) 2008, 2009 Slava Pestov.
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel math namespaces assocs hashtables sequences arrays
|
USING: kernel math namespaces assocs hashtables sequences arrays
|
||||||
accessors vectors combinators sets classes cpu.architecture
|
accessors words vectors combinators combinators.short-circuit
|
||||||
compiler.cfg compiler.cfg.registers compiler.cfg.instructions
|
sets classes layouts cpu.architecture
|
||||||
compiler.cfg.def-use compiler.cfg.copy-prop compiler.cfg.rpo
|
compiler.cfg
|
||||||
compiler.cfg.liveness ;
|
compiler.cfg.rpo
|
||||||
|
compiler.cfg.def-use
|
||||||
|
compiler.cfg.liveness
|
||||||
|
compiler.cfg.copy-prop
|
||||||
|
compiler.cfg.registers
|
||||||
|
compiler.cfg.comparisons
|
||||||
|
compiler.cfg.instructions
|
||||||
|
compiler.cfg.representations.preferred ;
|
||||||
IN: compiler.cfg.alias-analysis
|
IN: compiler.cfg.alias-analysis
|
||||||
|
|
||||||
! We try to eliminate redundant slot operations using some simple heuristics.
|
! We try to eliminate redundant slot operations using some simple heuristics.
|
||||||
|
@ -77,10 +84,15 @@ SYMBOL: acs>vregs
|
||||||
|
|
||||||
: ac>vregs ( ac -- vregs ) acs>vregs get at ;
|
: ac>vregs ( ac -- vregs ) acs>vregs get at ;
|
||||||
|
|
||||||
: aliases ( vreg -- vregs )
|
GENERIC: aliases ( vreg -- vregs )
|
||||||
|
|
||||||
|
M: integer aliases
|
||||||
#! All vregs which may contain the same value as vreg.
|
#! All vregs which may contain the same value as vreg.
|
||||||
vreg>ac ac>vregs ;
|
vreg>ac ac>vregs ;
|
||||||
|
|
||||||
|
M: word aliases
|
||||||
|
1array ;
|
||||||
|
|
||||||
: each-alias ( vreg quot -- )
|
: each-alias ( vreg quot -- )
|
||||||
[ aliases ] dip each ; inline
|
[ aliases ] dip each ; inline
|
||||||
|
|
||||||
|
@ -181,7 +193,6 @@ SYMBOL: constants
|
||||||
#! assigned by an ##load-immediate.
|
#! assigned by an ##load-immediate.
|
||||||
resolve constants get at ;
|
resolve constants get at ;
|
||||||
|
|
||||||
! We treat slot accessors and stack traffic alike
|
|
||||||
GENERIC: insn-slot# ( insn -- slot#/f )
|
GENERIC: insn-slot# ( insn -- slot#/f )
|
||||||
GENERIC: insn-object ( insn -- vreg )
|
GENERIC: insn-object ( insn -- vreg )
|
||||||
|
|
||||||
|
@ -190,7 +201,7 @@ M: ##slot-imm insn-slot# slot>> ;
|
||||||
M: ##set-slot insn-slot# slot>> constant ;
|
M: ##set-slot insn-slot# slot>> constant ;
|
||||||
M: ##set-slot-imm insn-slot# slot>> ;
|
M: ##set-slot-imm insn-slot# slot>> ;
|
||||||
M: ##alien-global insn-slot# [ library>> ] [ symbol>> ] bi 2array ;
|
M: ##alien-global insn-slot# [ library>> ] [ symbol>> ] bi 2array ;
|
||||||
M: ##vm-field-ptr insn-slot# field-name>> ; ! is this right?
|
M: ##vm-field-ptr insn-slot# field-name>> ;
|
||||||
|
|
||||||
M: ##slot insn-object obj>> resolve ;
|
M: ##slot insn-object obj>> resolve ;
|
||||||
M: ##slot-imm insn-object obj>> resolve ;
|
M: ##slot-imm insn-object obj>> resolve ;
|
||||||
|
@ -206,18 +217,33 @@ M: ##vm-field-ptr insn-object drop \ ##vm-field-ptr ;
|
||||||
H{ } clone live-slots set
|
H{ } clone live-slots set
|
||||||
H{ } clone constants set
|
H{ } clone constants set
|
||||||
H{ } clone copies set
|
H{ } clone copies set
|
||||||
|
|
||||||
0 ac-counter set
|
0 ac-counter set
|
||||||
next-ac heap-ac set
|
next-ac heap-ac set
|
||||||
|
|
||||||
|
\ ##vm-field-ptr set-new-ac
|
||||||
|
\ ##alien-global set-new-ac
|
||||||
|
|
||||||
dup local-live-in [ set-heap-ac ] each ;
|
dup local-live-in [ set-heap-ac ] each ;
|
||||||
|
|
||||||
GENERIC: analyze-aliases* ( insn -- insn' )
|
GENERIC: analyze-aliases* ( insn -- insn' )
|
||||||
|
|
||||||
M: insn analyze-aliases*
|
M: insn analyze-aliases*
|
||||||
dup defs-vreg [ set-heap-ac ] when* ;
|
! If an instruction defines a value with a non-integer
|
||||||
|
! representation it means that the value will be boxed
|
||||||
|
! anywhere its used as a tagged pointer. Boxing allocates
|
||||||
|
! a new value, except boxing instructions haven't been
|
||||||
|
! inserted yet.
|
||||||
|
dup defs-vreg [
|
||||||
|
over defs-vreg-rep int-rep eq?
|
||||||
|
[ set-heap-ac ] [ set-new-ac ] if
|
||||||
|
] when* ;
|
||||||
|
|
||||||
|
M: ##phi analyze-aliases*
|
||||||
|
dup defs-vreg set-heap-ac ;
|
||||||
|
|
||||||
M: ##load-immediate analyze-aliases*
|
M: ##load-immediate analyze-aliases*
|
||||||
|
call-next-method
|
||||||
dup [ val>> ] [ dst>> ] bi constants get set-at ;
|
dup [ val>> ] [ dst>> ] bi constants get set-at ;
|
||||||
|
|
||||||
M: ##allocation analyze-aliases*
|
M: ##allocation analyze-aliases*
|
||||||
|
@ -249,6 +275,18 @@ M: ##copy analyze-aliases*
|
||||||
#! vreg, since they both contain the same value.
|
#! vreg, since they both contain the same value.
|
||||||
dup record-copy ;
|
dup record-copy ;
|
||||||
|
|
||||||
|
: useless-compare? ( insn -- ? )
|
||||||
|
{
|
||||||
|
[ cc>> cc= eq? ]
|
||||||
|
[ [ src1>> vreg>ac ] [ src2>> vreg>ac ] bi = not ]
|
||||||
|
} 1&& ; inline
|
||||||
|
|
||||||
|
M: ##compare analyze-aliases*
|
||||||
|
dup useless-compare? [
|
||||||
|
dst>> \ f tag-number \ ##load-immediate new-insn
|
||||||
|
analyze-aliases*
|
||||||
|
] when ;
|
||||||
|
|
||||||
: analyze-aliases ( insns -- insns' )
|
: analyze-aliases ( insns -- insns' )
|
||||||
[ insn# set analyze-aliases* ] map-index sift ;
|
[ insn# set analyze-aliases* ] map-index sift ;
|
||||||
|
|
||||||
|
|
|
@ -721,7 +721,7 @@ UNION: ##allocation
|
||||||
##box-displaced-alien ;
|
##box-displaced-alien ;
|
||||||
|
|
||||||
! For alias analysis
|
! For alias analysis
|
||||||
UNION: ##read ##slot ##slot-imm ;
|
UNION: ##read ##slot ##slot-imm ##vm-field-ptr ##alien-global ;
|
||||||
UNION: ##write ##set-slot ##set-slot-imm ;
|
UNION: ##write ##set-slot ##set-slot-imm ;
|
||||||
|
|
||||||
! Instructions that kill all live vregs but cannot trigger GC
|
! Instructions that kill all live vregs but cannot trigger GC
|
||||||
|
|
|
@ -75,7 +75,7 @@ M: insn remove-dead-barrier drop t ;
|
||||||
! Anticipation of this and set-slot would help too, maybe later
|
! Anticipation of this and set-slot would help too, maybe later
|
||||||
FORWARD-ANALYSIS: slot
|
FORWARD-ANALYSIS: slot
|
||||||
|
|
||||||
UNION: access ##read ##write ;
|
UNION: access ##slot ##slot-imm ##set-slot ##set-slot-imm ;
|
||||||
|
|
||||||
M: slot-analysis transfer-set
|
M: slot-analysis transfer-set
|
||||||
drop [ H{ } assoc-clone-like ] dip
|
drop [ H{ } assoc-clone-like ] dip
|
||||||
|
|
Loading…
Reference in New Issue