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.useless-blocks
7 : update-predecessor-for-delete ( 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 [
12 2dup eq? [ drop successors>> first ] [ nip ] if
14 ] change-successors drop ;
16 : update-successor-for-delete ( 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 [
21 2dup eq? [ drop predecessors>> first ] [ nip ] if
23 ] change-predecessors drop ;
25 : delete-basic-block ( bb -- )
26 [ update-predecessor-for-delete ]
27 [ update-successor-for-delete ]
30 : delete-basic-block? ( bb -- ? )
32 [ instructions>> length 1 = ]
33 [ predecessors>> length 1 = ]
34 [ successors>> length 1 = ]
35 [ instructions>> first ##branch? ]
38 : delete-useless-blocks ( cfg -- cfg' )
40 dup delete-basic-block? [ delete-basic-block ] [ drop ] if
44 : delete-conditional? ( bb -- ? )
45 dup instructions>> [ drop f ] [
49 ##compare-float-branch
50 } memq? [ successors>> first2 eq? ] [ drop f ] if
53 : delete-conditional ( bb -- )
54 dup successors>> first 1vector >>successors
55 [ but-last \ ##branch new-insn suffix ] change-instructions
58 : delete-useless-conditionals ( cfg -- cfg' )
60 dup delete-conditional? [ delete-conditional ] [ drop ] if