1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math accessors sequences namespaces make
4 combinators assocs arrays locals layouts hashtables
5 cpu.architecture generalizations
7 compiler.cfg.comparisons
8 compiler.cfg.stack-frame
9 compiler.cfg.instructions
10 compiler.cfg.utilities
11 compiler.cfg.linearization.order ;
12 IN: compiler.cfg.linearization
18 : block-number ( bb -- n ) numbers get at ;
20 : number-blocks ( bbs -- ) [ 2array ] map-index >hashtable numbers set ;
22 GENERIC: linearize-insn ( basic-block insn -- )
24 M: insn linearize-insn , drop ;
26 : useless-branch? ( basic-block successor -- ? )
27 ! If our successor immediately follows us in linearization
28 ! order then we don't need to branch.
29 [ block-number ] bi@ 1 - = ; inline
31 : emit-branch ( bb successor -- )
32 2dup useless-branch? [ 2drop ] [ nip block-number _branch ] if ;
34 M: ##branch linearize-insn
35 drop dup successors>> first emit-branch ;
37 GENERIC: negate-insn-cc ( insn -- )
39 M: conditional-branch-insn negate-insn-cc
40 [ negate-cc ] change-cc drop ;
42 M: ##test-vector-branch negate-insn-cc
43 [ negate-vcc ] change-vcc drop ;
45 M:: conditional-branch-insn linearize-insn ( bb insn -- )
46 bb successors>> first2 :> ( first second )
47 bb second useless-branch?
49 [ bb first second insn negate-insn-cc ] if
50 block-number insn _conditional-branch
53 M: ##dispatch linearize-insn
54 , successors>> [ block-number _dispatch-label ] each ;
56 : linearize-basic-block ( bb -- )
57 [ block-number _label ]
58 [ dup instructions>> [ linearize-insn ] with each ]
61 : linearize-basic-blocks ( cfg -- insns )
66 [ [ linearize-basic-block ] each ] bi
67 ] [ spill-area-size>> _spill-area-size ] bi
72 : flatten-cfg ( cfg -- mr )
73 [ linearize-basic-blocks ] [ word>> ] [ label>> ] tri