factor/library/inference/kill-literals.factor

119 lines
3.0 KiB
Factor
Raw Normal View History

2005-08-07 00:00:57 -04:00
! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: inference
USING: generic hashtables inference kernel lists
matrices namespaces sequences vectors ;
GENERIC: literals* ( node -- )
: literals ( node -- seq )
[ [ literals* ] each-node ] make-vector ;
GENERIC: can-kill* ( literal node -- ? )
: can-kill? ( literal node -- ? )
#! Return false if the literal appears in any node in the
#! list.
dup [
2005-08-13 04:01:21 -04:00
2dup can-kill* [
2dup node-children [ can-kill? ] all-with? [
node-successor can-kill?
] [
2drop f
] ifte
] [
2drop f
] ifte
2005-08-07 00:00:57 -04:00
] [
2drop t
] ifte ;
: kill-set ( node -- list )
#! Push a list of literals that may be killed in the IR.
dup literals [ swap can-kill? ] subset-with ;
: remove-values ( values node -- )
2dup [ node-in-d seq-diff ] keep set-node-in-d
2dup [ node-out-d seq-diff ] keep set-node-out-d
2dup [ node-in-r seq-diff ] keep set-node-in-r
[ node-out-r seq-diff ] keep set-node-out-r ;
GENERIC: kill-node* ( literals node -- )
M: node kill-node* ( literals node -- ) 2drop ;
: kill-node ( literals node -- )
[ 2dup kill-node* remove-values ] each-node-with ;
! Generic nodes
M: node literals* ( node -- ) drop ;
M: node can-kill* ( literal node -- ? ) uses-value? not ;
! #push
M: #push literals* ( node -- )
node-out-d % ;
2005-08-13 04:01:21 -04:00
M: #push can-kill* ( literal node -- ? ) 2drop t ;
2005-08-07 00:00:57 -04:00
M: #push kill-node* ( literals node -- )
[ node-out-d seq-diff ] keep set-node-out-d ;
! #drop
2005-08-13 04:01:21 -04:00
M: #drop can-kill* ( literal node -- ? ) 2drop t ;
2005-08-07 00:00:57 -04:00
! #call
: (kill-shuffle) ( word -- map )
{{
[[ dup {{ }} ]]
[[ drop {{ }} ]]
[[ swap {{ }} ]]
[[ over
{{
[[ { f t } dup ]]
}}
]]
[[ pick
{{
[[ { f f t } over ]]
[[ { f t f } over ]]
[[ { f t t } dup ]]
}}
]]
[[ >r {{ }} ]]
[[ r> {{ }} ]]
}} hash ;
M: #call can-kill* ( literal node -- ? )
dup node-param (kill-shuffle) >r delegate can-kill* r> or ;
: kill-mask ( killing node -- mask )
dup node-param \ r> = [ node-in-r ] [ node-in-d ] ifte
[ swap memq? ] map-with ;
: lookup-mask ( mask word -- word )
over disjunction [ (kill-shuffle) hash ] [ nip ] ifte ;
2005-08-07 00:00:57 -04:00
: kill-shuffle ( literals node -- )
#! If certain values passing through a stack op are being
#! killed, the stack op can be reduced, in extreme cases
#! to a no-op.
[ [ kill-mask ] keep node-param lookup-mask ] keep
set-node-param ;
M: #call kill-node* ( literals node -- )
dup node-param (kill-shuffle)
[ kill-shuffle ] [ 2drop ] ifte ;
! #call-label
2005-08-13 04:01:21 -04:00
M: #call-label can-kill* ( literal node -- ? ) 2drop t ;
2005-08-07 00:00:57 -04:00
! #values
2005-08-13 04:01:21 -04:00
M: #values can-kill* ( literal node -- ? ) 2drop t ;
2005-08-07 00:00:57 -04:00
! #merge
M: #merge can-kill* ( literal node -- ? ) 2drop t ;
! #entry
M: #entry can-kill* ( literal node -- ? ) 2drop t ;