]> gitweb.factorcode.org Git - factor.git/blob - unfinished/compiler/machine/optimizer/optimizer.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / unfinished / compiler / machine / optimizer / optimizer.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors math namespaces make sequences
4 sequences.next
5 compiler.instructions
6 compiler.instructions.syntax
7 compiler.machine ;
8 IN: compiler.machine.optimizer
9
10 : frame-required ( insns -- n/f )
11     [ %frame-required? ] filter
12     [ f ] [ [ n>> ] map supremum ] if-empty ;
13
14 GENERIC: optimize* ( next insn -- )
15
16 : useless-branch? ( next insn -- ? )
17     over _label? [ [ label>> ] bi@ = ] [ 2drop f ] if ;
18
19 M: _branch optimize*
20     #! Remove unconditional branches to labels immediately
21     #! following.
22     tuck useless-branch? [ drop ] [ , ] if ;
23
24 M: %prologue optimize*
25     2drop \ frame-required get [ _prologue ] when* ;
26
27 M: %epilogue optimize*
28     2drop \ frame-required get [ _epilogue ] when* ;
29
30 M: %frame-required optimize* 2drop ;
31
32 M: insn optimize* nip , ;
33
34 : optimize-machine ( insns -- insns )
35     [
36         [ frame-required \ frame-required set ]
37         [ [ optimize* ] each-next ]
38         bi
39     ] { } make ;