DCE fixes
parent
aa9341e579
commit
0efec0eff1
|
@ -92,7 +92,7 @@ M: node generate-node drop iterate-next ;
|
|||
%jump-label ;
|
||||
|
||||
: generate-call ( label -- next )
|
||||
! dup maybe-compile
|
||||
dup maybe-compile
|
||||
end-basic-block
|
||||
dup compiling-loops get at [
|
||||
%jump-label f
|
||||
|
|
|
@ -22,9 +22,6 @@ IN: compiler.tree.builder
|
|||
] with-tree-builder nip
|
||||
unclip-last in-d>> ;
|
||||
|
||||
: ends-with-terminate? ( nodes -- ? )
|
||||
dup empty? [ drop f ] [ peek #terminate? ] if ;
|
||||
|
||||
: build-sub-tree ( #call quot -- nodes )
|
||||
[ [ out-d>> ] [ in-d>> ] bi ] dip build-tree-with
|
||||
over ends-with-terminate?
|
||||
|
|
|
@ -117,11 +117,19 @@ M: #branch cleanup*
|
|||
[ live-branches>> live-branches set ]
|
||||
} cleave ;
|
||||
|
||||
: eliminate-phi ( #phi -- node )
|
||||
dup phi-in-d>> length {
|
||||
{ 0 [ drop f ] }
|
||||
{ 1 [ [ phi-in-d>> first ] [ out-d>> ] bi #copy ] }
|
||||
[ drop ]
|
||||
} case ;
|
||||
|
||||
M: #phi cleanup*
|
||||
#! Remove #phi function inputs which no longer exist.
|
||||
live-branches get
|
||||
[ '[ , select-children sift ] change-phi-in-d ]
|
||||
[ '[ , select-children sift ] change-phi-info-d ] bi
|
||||
eliminate-phi
|
||||
live-branches off ;
|
||||
|
||||
: >copy ( node -- #copy ) [ in-d>> ] [ out-d>> ] bi #copy ;
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
! Copyright (C) 2008 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: sequences namespaces kernel accessors assocs sets fry
|
||||
arrays combinators columns stack-checker.backend compiler.tree
|
||||
compiler.tree.combinators compiler.tree.dead-code.liveness
|
||||
compiler.tree.dead-code.simple ;
|
||||
arrays combinators columns stack-checker.backend
|
||||
stack-checker.branches compiler.tree compiler.tree.combinators
|
||||
compiler.tree.dead-code.liveness compiler.tree.dead-code.simple
|
||||
;
|
||||
IN: compiler.tree.dead-code.branches
|
||||
|
||||
M: #if mark-live-values* look-at-inputs ;
|
||||
|
@ -26,10 +27,9 @@ M: #branch remove-dead-code*
|
|||
bi ;
|
||||
|
||||
: remove-phi-inputs ( #phi -- )
|
||||
dup [ out-d>> ] [ phi-in-d>> flip ] bi
|
||||
filter-corresponding
|
||||
flip >>phi-in-d
|
||||
drop ;
|
||||
if-node get children>>
|
||||
[ dup ends-with-terminate? [ drop f ] [ peek out-d>> ] if ] map
|
||||
pad-with-bottom >>phi-in-d drop ;
|
||||
|
||||
: live-value-indices ( values -- indices )
|
||||
[ length ] keep live-values get
|
||||
|
@ -42,7 +42,10 @@ M: #branch remove-dead-code*
|
|||
#shuffle ;
|
||||
|
||||
: insert-drops ( nodes values indices -- nodes' )
|
||||
'[ , drop-values suffix ] 2map ;
|
||||
'[
|
||||
over ends-with-terminate?
|
||||
[ drop ] [ , drop-values suffix ] if
|
||||
] 2map ;
|
||||
|
||||
: hoist-drops ( #phi -- )
|
||||
if-node get swap
|
||||
|
@ -50,8 +53,7 @@ M: #branch remove-dead-code*
|
|||
'[ , , insert-drops ] change-children drop ;
|
||||
|
||||
: remove-phi-outputs ( #phi -- )
|
||||
[ filter-live ] change-out-d
|
||||
drop ;
|
||||
[ filter-live ] change-out-d drop ;
|
||||
|
||||
M: #phi remove-dead-code*
|
||||
{
|
||||
|
|
|
@ -98,3 +98,5 @@ IN: compiler.tree.dead-code.tests
|
|||
[ ] [ [ dup [ 3 throw ] [ ] if ] optimize-quot drop ] unit-test
|
||||
|
||||
[ [ [ . ] [ drop ] if ] ] [ [ [ dup . ] [ ] if drop ] optimize-quot ] unit-test
|
||||
|
||||
[ [ f ] ] [ [ f dup [ ] [ ] if ] optimize-quot ] unit-test
|
||||
|
|
|
@ -183,6 +183,9 @@ M: #return-recursive inputs/outputs [ in-d>> ] [ out-d>> ] bi ;
|
|||
: recursive-phi-in ( #enter-recursive -- seq )
|
||||
[ label>> calls>> [ in-d>> ] map ] [ in-d>> ] bi suffix ;
|
||||
|
||||
: ends-with-terminate? ( nodes -- ? )
|
||||
dup empty? [ drop f ] [ peek #terminate? ] if ;
|
||||
|
||||
M: vector child-visitor V{ } clone ;
|
||||
M: vector #introduce, #introduce node, ;
|
||||
M: vector #call, #call node, ;
|
||||
|
|
Loading…
Reference in New Issue