1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors sequences combinators classes vectors
4 compiler.cfg compiler.cfg.rpo compiler.cfg.instructions ;
5 IN: compiler.cfg.useless-blocks
7 : update-predecessor-for-delete ( bb -- )
8 dup predecessors>> first [
10 2dup eq? [ drop successors>> first ] [ nip ] if
12 ] change-successors drop ;
14 : update-successor-for-delete ( bb -- )
15 [ predecessors>> first ]
16 [ successors>> first predecessors>> ]
19 : delete-basic-block ( bb -- )
20 [ update-predecessor-for-delete ]
21 [ update-successor-for-delete ]
24 : delete-basic-block? ( bb -- ? )
26 { [ dup instructions>> length 1 = not ] [ f ] }
27 { [ dup predecessors>> length 1 = not ] [ f ] }
28 { [ dup successors>> length 1 = not ] [ f ] }
29 { [ dup instructions>> first ##branch? not ] [ f ] }
33 : delete-useless-blocks ( cfg -- cfg' )
35 dup delete-basic-block? [ delete-basic-block ] [ drop ] if
38 : delete-conditional? ( bb -- ? )
39 dup instructions>> [ drop f ] [
43 ##compare-float-branch
44 } memq? [ successors>> first2 eq? ] [ drop f ] if
47 : delete-conditional ( bb -- )
48 dup successors>> first 1vector >>successors
49 [ but-last f \ ##branch boa suffix ] change-instructions
52 : delete-useless-conditionals ( cfg -- cfg' )
54 dup delete-conditional? [ delete-conditional ] [ drop ] if