From 0efec0eff12ecab579cc125e5218d3a73dd743f5 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 18 Aug 2008 21:30:10 -0500 Subject: [PATCH] DCE fixes --- basis/compiler/generator/generator.factor | 2 +- basis/compiler/tree/builder/builder.factor | 3 --- basis/compiler/tree/cleanup/cleanup.factor | 8 +++++++ .../tree/dead-code/branches/branches.factor | 22 ++++++++++--------- .../tree/dead-code/dead-code-tests.factor | 2 ++ basis/compiler/tree/tree.factor | 3 +++ 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/basis/compiler/generator/generator.factor b/basis/compiler/generator/generator.factor index 4d826c40d2..35ad0656cd 100755 --- a/basis/compiler/generator/generator.factor +++ b/basis/compiler/generator/generator.factor @@ -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 diff --git a/basis/compiler/tree/builder/builder.factor b/basis/compiler/tree/builder/builder.factor index 8a59f82bcf..8bc0f72ac9 100644 --- a/basis/compiler/tree/builder/builder.factor +++ b/basis/compiler/tree/builder/builder.factor @@ -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? diff --git a/basis/compiler/tree/cleanup/cleanup.factor b/basis/compiler/tree/cleanup/cleanup.factor index 3f530effd3..ff42a08818 100644 --- a/basis/compiler/tree/cleanup/cleanup.factor +++ b/basis/compiler/tree/cleanup/cleanup.factor @@ -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 ; diff --git a/basis/compiler/tree/dead-code/branches/branches.factor b/basis/compiler/tree/dead-code/branches/branches.factor index 7bff7aa148..bbae02b4ff 100644 --- a/basis/compiler/tree/dead-code/branches/branches.factor +++ b/basis/compiler/tree/dead-code/branches/branches.factor @@ -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* { diff --git a/basis/compiler/tree/dead-code/dead-code-tests.factor b/basis/compiler/tree/dead-code/dead-code-tests.factor index 14e66fa648..8804a9417e 100644 --- a/basis/compiler/tree/dead-code/dead-code-tests.factor +++ b/basis/compiler/tree/dead-code/dead-code-tests.factor @@ -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 diff --git a/basis/compiler/tree/tree.factor b/basis/compiler/tree/tree.factor index b994ce8bfc..40a35e66d4 100755 --- a/basis/compiler/tree/tree.factor +++ b/basis/compiler/tree/tree.factor @@ -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, ;