From 747a2d72c8903af9e7f5454dc2886a42c4e51e66 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 23 Jul 2009 18:02:46 -0500 Subject: [PATCH] compiler.cfg.empty-blocks: new pass to delete empty blocks, runs after phi elimination --- .../cfg/empty-blocks/empty-blocks.factor | 38 +++++++++++++++++++ basis/compiler/cfg/optimizer/optimizer.factor | 2 + 2 files changed, 40 insertions(+) create mode 100644 basis/compiler/cfg/empty-blocks/empty-blocks.factor diff --git a/basis/compiler/cfg/empty-blocks/empty-blocks.factor b/basis/compiler/cfg/empty-blocks/empty-blocks.factor new file mode 100644 index 0000000000..2a31a20b72 --- /dev/null +++ b/basis/compiler/cfg/empty-blocks/empty-blocks.factor @@ -0,0 +1,38 @@ +! Copyright (C) 2008, 2009 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel accessors sequences combinators combinators.short-circuit +classes vectors compiler.cfg compiler.cfg.instructions compiler.cfg.rpo ; +IN: compiler.cfg.empty-blocks + +: update-predecessor ( bb -- ) + ! We have to replace occurrences of bb with bb's successor + ! in bb's predecessor's list of successors. + dup predecessors>> first [ + [ + 2dup eq? [ drop successors>> first ] [ nip ] if + ] with map + ] change-successors drop ; + +: update-successor ( bb -- ) + ! We have to replace occurrences of bb with bb's predecessor + ! in bb's sucessor's list of predecessors. + dup successors>> first [ + [ + 2dup eq? [ drop predecessors>> first ] [ nip ] if + ] with map + ] change-predecessors drop ; + +: delete-basic-block ( bb -- ) + [ update-predecessor ] [ update-successor ] bi ; + +: delete-basic-block? ( bb -- ? ) + { + [ instructions>> length 1 = ] + [ predecessors>> length 1 = ] + [ successors>> length 1 = ] + [ instructions>> first ##branch? ] + } 1&& ; + +: delete-empty-blocks ( cfg -- cfg' ) + dup [ dup delete-basic-block? [ delete-basic-block ] [ drop ] if ] each-basic-block + cfg-changed ; \ No newline at end of file diff --git a/basis/compiler/cfg/optimizer/optimizer.factor b/basis/compiler/cfg/optimizer/optimizer.factor index 1419ff1952..0b37157b43 100644 --- a/basis/compiler/cfg/optimizer/optimizer.factor +++ b/basis/compiler/cfg/optimizer/optimizer.factor @@ -14,6 +14,7 @@ compiler.cfg.dce compiler.cfg.write-barrier compiler.cfg.rpo compiler.cfg.phi-elimination +compiler.cfg.empty-blocks compiler.cfg.checker ; IN: compiler.cfg.optimizer @@ -42,5 +43,6 @@ SYMBOL: check-optimizer? eliminate-dead-code eliminate-write-barriers eliminate-phis + delete-empty-blocks ?check ] with-scope ;