1 ! Copyright (C) 2011 Alex Vondrak.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs hashtables kernel namespaces sequences
6 compiler.cfg.dataflow-analysis
9 compiler.cfg.predecessors
10 compiler.cfg.renaming.functor
12 FROM: namespaces => set ;
14 IN: compiler.cfg.gvn.avail
16 : defined ( bb -- vregs )
17 instructions>> [ defs-vregs ] map concat unique ;
19 ! This doesn't propagate across "kill blocks". Not sure if
20 ! that's right, though I may as well assume as much.
22 FORWARD-ANALYSIS: avail
24 M: avail-analysis transfer-set drop defined assoc-union ;
26 : available? ( vn -- ? ) basic-block get avail-in key? ;
28 : best-vreg ( available-vregs -- vreg )
29 [ f ] [ infimum ] if-empty ;
31 : >avail-vreg ( vreg -- vreg/f )
32 final-iteration? get [
33 congruence-class [ available? ] filter best-vreg
36 : available-uses? ( insn -- ? )
37 uses-vregs [ >avail-vreg ] all? ;
39 : with-available-uses? ( quot -- ? )
40 keep swap [ available-uses? ] [ drop f ] if ; inline
42 : make-available ( vreg -- )
43 basic-block get avail-ins get [ dupd clone ?set-at ] assocs:change-at ;
45 RENAMING: >avail [ ] [ dup >avail-vreg swap or ] [ ]