1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors math namespaces make sequences
6 compiler.instructions.syntax
8 IN: compiler.machine.optimizer
10 : frame-required ( insns -- n/f )
11 [ %frame-required? ] filter
12 [ f ] [ [ n>> ] map supremum ] if-empty ;
14 GENERIC: optimize* ( next insn -- )
16 : useless-branch? ( next insn -- ? )
17 over _label? [ [ label>> ] bi@ = ] [ 2drop f ] if ;
20 #! Remove unconditional branches to labels immediately
22 tuck useless-branch? [ drop ] [ , ] if ;
24 M: %prologue optimize*
25 2drop \ frame-required get [ _prologue ] when* ;
27 M: %epilogue optimize*
28 2drop \ frame-required get [ _epilogue ] when* ;
30 M: %frame-required optimize* 2drop ;
32 M: insn optimize* nip , ;
34 : optimize-machine ( insns -- insns )
36 [ frame-required \ frame-required set ]
37 [ [ optimize* ] each-next ]