compiler.cfg.empty-blocks: new pass to delete empty blocks, runs after phi elimination

db4
Slava Pestov 2009-07-23 18:02:46 -05:00
parent 93c58a8bb5
commit 747a2d72c8
2 changed files with 40 additions and 0 deletions

View File

@ -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 ;

View File

@ -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 ;