]> gitweb.factorcode.org Git - factor.git/blob - unfinished/compiler/cfg.bluesky/stack/stack.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / unfinished / compiler / cfg.bluesky / stack / stack.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors math namespaces sequences kernel fry
4 compiler.vops ;
5 IN: compiler.cfg.stack
6
7 ! Combine multiple stack height changes into one, done at the
8 ! start of the basic block.
9 !
10 ! Alias analysis and value numbering assume this optimization
11 ! has been performed.
12
13 ! Current data and retain stack height is stored in
14 ! %data, %retain variables.
15 GENERIC: compute-heights ( insn -- )
16
17 M: %height compute-heights
18     [ n>> ] [ stack>> ] bi [ + ] change ;
19
20 M: object compute-heights drop ;
21
22 GENERIC: normalize-height* ( insn -- insn )
23
24 M: %height normalize-height*
25     [ n>> ] [ stack>> ] bi [ swap - ] change nop ;
26
27 : (normalize-height) ( insn -- insn )
28     dup stack>> get '[ , + ] change-n ; inline
29
30 M: %peek normalize-height* (normalize-height) ;
31
32 M: %replace normalize-height* (normalize-height) ;
33
34 M: object normalize-height* ;
35
36 : normalize-height ( insns -- insns' )
37     0 %data set
38     0 %retain set
39     [ [ compute-heights ] each ]
40     [ [ [ normalize-height* ] map ] with-scope ] bi
41     %data get dup zero? [ drop ] [ %data %height boa prefix ] if
42     %retain get dup zero? [ drop ] [ %retain %height boa prefix ] if ;