2010-01-14 10:10:13 -05:00
|
|
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
2008-08-13 19:56:50 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: sequences namespaces kernel accessors assocs sets fry
|
2008-08-18 22:30:10 -04:00
|
|
|
arrays combinators columns stack-checker.backend
|
|
|
|
stack-checker.branches compiler.tree compiler.tree.combinators
|
2009-08-13 20:21:44 -04:00
|
|
|
compiler.tree.dead-code.liveness compiler.tree.dead-code.simple ;
|
2010-02-26 16:01:01 -05:00
|
|
|
FROM: namespaces => set ;
|
2008-08-13 19:56:50 -04:00
|
|
|
IN: compiler.tree.dead-code.branches
|
|
|
|
|
|
|
|
M: #if mark-live-values* look-at-inputs ;
|
|
|
|
|
|
|
|
M: #dispatch mark-live-values* look-at-inputs ;
|
|
|
|
|
2008-08-14 00:52:49 -04:00
|
|
|
: look-at-phi ( value outputs inputs -- )
|
|
|
|
[ index ] dip swap dup [ <column> look-at-values ] [ 2drop ] if ;
|
2008-08-13 19:56:50 -04:00
|
|
|
|
|
|
|
M: #phi compute-live-values*
|
|
|
|
#! If any of the outputs of a #phi are live, then the
|
|
|
|
#! corresponding inputs are live too.
|
2008-08-18 21:49:03 -04:00
|
|
|
[ out-d>> ] [ phi-in-d>> ] bi look-at-phi ;
|
2008-08-13 19:56:50 -04:00
|
|
|
|
2008-08-18 16:47:49 -04:00
|
|
|
SYMBOL: if-node
|
|
|
|
|
2008-08-15 00:35:19 -04:00
|
|
|
M: #branch remove-dead-code*
|
2008-08-18 16:47:49 -04:00
|
|
|
[ [ [ (remove-dead-code) ] map ] change-children ]
|
|
|
|
[ if-node set ]
|
|
|
|
bi ;
|
2008-08-13 19:56:50 -04:00
|
|
|
|
2008-08-14 00:52:49 -04:00
|
|
|
: remove-phi-inputs ( #phi -- )
|
2008-08-18 22:30:10 -04:00
|
|
|
if-node get children>>
|
2009-05-25 17:38:33 -04:00
|
|
|
[ dup ends-with-terminate? [ drop f ] [ last out-d>> ] if ] map
|
2008-08-18 22:30:10 -04:00
|
|
|
pad-with-bottom >>phi-in-d drop ;
|
2008-08-14 00:52:49 -04:00
|
|
|
|
2008-08-18 16:47:49 -04:00
|
|
|
: live-value-indices ( values -- indices )
|
2009-06-10 10:45:48 -04:00
|
|
|
[ length iota ] keep live-values get
|
2008-09-10 23:11:40 -04:00
|
|
|
'[ _ nth _ key? ] filter ; inline
|
2008-08-18 16:47:49 -04:00
|
|
|
|
2008-08-22 19:09:48 -04:00
|
|
|
: drop-indexed-values ( values indices -- node )
|
2008-09-12 19:08:38 -04:00
|
|
|
[ drop filter-live ] [ swap nths ] 2bi
|
2010-01-14 10:10:13 -05:00
|
|
|
[ length make-values ] keep
|
2008-08-18 16:47:49 -04:00
|
|
|
[ drop ] [ zip ] 2bi
|
2008-11-11 19:46:31 -05:00
|
|
|
#data-shuffle ;
|
2008-08-18 16:47:49 -04:00
|
|
|
|
2008-08-18 21:49:03 -04:00
|
|
|
: insert-drops ( nodes values indices -- nodes' )
|
2008-08-18 22:30:10 -04:00
|
|
|
'[
|
|
|
|
over ends-with-terminate?
|
2008-09-10 23:11:40 -04:00
|
|
|
[ drop ] [ _ drop-indexed-values suffix ] if
|
2008-08-18 22:30:10 -04:00
|
|
|
] 2map ;
|
2008-08-18 16:47:49 -04:00
|
|
|
|
|
|
|
: hoist-drops ( #phi -- )
|
|
|
|
if-node get swap
|
2008-08-18 21:49:03 -04:00
|
|
|
[ phi-in-d>> ] [ out-d>> live-value-indices ] bi
|
2008-09-10 23:11:40 -04:00
|
|
|
'[ _ _ insert-drops ] change-children drop ;
|
2008-08-13 19:56:50 -04:00
|
|
|
|
|
|
|
: remove-phi-outputs ( #phi -- )
|
2008-08-18 22:30:10 -04:00
|
|
|
[ filter-live ] change-out-d drop ;
|
2008-08-13 19:56:50 -04:00
|
|
|
|
|
|
|
M: #phi remove-dead-code*
|
2008-08-14 00:52:49 -04:00
|
|
|
{
|
2008-08-18 16:47:49 -04:00
|
|
|
[ hoist-drops ]
|
2008-08-14 00:52:49 -04:00
|
|
|
[ remove-phi-inputs ]
|
|
|
|
[ remove-phi-outputs ]
|
|
|
|
[ ]
|
|
|
|
} cleave ;
|