1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors math namespaces sequences kernel fry
7 ! Combine multiple stack height changes into one, done at the
8 ! start of the basic block.
10 ! Alias analysis and value numbering assume this optimization
13 ! Current data and retain stack height is stored in
14 ! %data, %retain variables.
15 GENERIC: compute-heights ( insn -- )
17 M: %height compute-heights
18 [ n>> ] [ stack>> ] bi [ + ] change ;
20 M: object compute-heights drop ;
22 GENERIC: normalize-height* ( insn -- insn )
24 M: %height normalize-height*
25 [ n>> ] [ stack>> ] bi [ swap - ] change nop ;
27 : (normalize-height) ( insn -- insn )
28 dup stack>> get '[ , + ] change-n ; inline
30 M: %peek normalize-height* (normalize-height) ;
32 M: %replace normalize-height* (normalize-height) ;
34 M: object normalize-height* ;
36 : normalize-height ( insns -- insns' )
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 ;