1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors namespaces make math sequences sets
4 assocs fry compiler.cfg compiler.cfg.instructions ;
5 FROM: namespaces => set ;
10 : post-order-traversal ( bb -- )
11 dup visited get key? [ drop ] [
12 dup visited get conjoin
14 successors>> <reversed>
15 [ post-order-traversal ] each
19 : number-blocks ( blocks -- )
20 dup length iota <reversed>
21 [ >>number drop ] 2each ;
23 : post-order ( cfg -- blocks )
24 dup post-order>> [ ] [
26 H{ } clone visited set
27 dup entry>> post-order-traversal
28 ] { } make dup number-blocks
29 >>post-order post-order>>
32 : reverse-post-order ( cfg -- blocks )
33 post-order <reversed> ; inline
35 : each-basic-block ( cfg quot -- )
36 [ reverse-post-order ] dip each ; inline
38 : optimize-basic-block ( bb quot -- )
39 [ drop basic-block set ]
40 [ change-instructions drop ] 2bi ; inline
42 : local-optimization ( ... cfg quot: ( ... insns -- ... insns' ) -- ... cfg' )
43 dupd '[ _ optimize-basic-block ] each-basic-block ; inline
45 : needs-post-order ( cfg -- cfg' )