]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/empty-blocks/empty-blocks.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / compiler / cfg / empty-blocks / empty-blocks.factor
1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors sequences combinators combinators.short-circuit
4 classes vectors compiler.cfg compiler.cfg.instructions compiler.cfg.rpo ;
5 IN: compiler.cfg.empty-blocks
6  
7 : update-predecessor ( bb -- )
8     ! We have to replace occurrences of bb with bb's successor
9     ! in bb's predecessor's list of successors.
10     dup predecessors>> first [
11         [
12             2dup eq? [ drop successors>> first ] [ nip ] if
13         ] with map
14     ] change-successors drop ;
15  
16 : update-successor ( bb -- )
17     ! We have to replace occurrences of bb with bb's predecessor
18     ! in bb's sucessor's list of predecessors.
19     dup successors>> first [
20         [
21             2dup eq? [ drop predecessors>> first ] [ nip ] if
22         ] with map
23     ] change-predecessors drop ;
24  
25 : delete-basic-block ( bb -- )
26     [ update-predecessor ] [ update-successor ] bi ;
27  
28 : delete-basic-block? ( bb -- ? )
29     {
30         [ instructions>> length 1 = ]
31         [ predecessors>> length 1 = ]
32         [ successors>> length 1 = ]
33         [ instructions>> first ##branch? ]
34     } 1&& ;
35  
36 : delete-empty-blocks ( cfg -- cfg' )
37     dup [ dup delete-basic-block? [ delete-basic-block ] [ drop ] if ] each-basic-block
38     cfg-changed ;