1 ! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators.short-circuit
4 compiler.cfg.instructions compiler.cfg.rpo kernel namespaces
6 FROM: namespaces => set ;
7 IN: compiler.cfg.write-barrier
9 ! This pass must run after GC check insertion and scheduling.
11 SYMBOL: fresh-allocations
13 SYMBOL: mutated-objects
17 : resolve-copy ( src -- dst )
20 GENERIC: eliminate-write-barrier ( insn -- ? )
22 : fresh-allocation ( vreg -- )
23 fresh-allocations get adjoin ;
25 M: ##allot eliminate-write-barrier
26 dst>> fresh-allocation t ;
28 : mutated-object ( vreg -- )
29 resolve-copy mutated-objects get adjoin ;
31 M: ##set-slot eliminate-write-barrier
32 obj>> mutated-object t ;
34 M: ##set-slot-imm eliminate-write-barrier
35 obj>> mutated-object t ;
37 : needs-write-barrier? ( insn -- ? )
39 [ fresh-allocations get in? not ]
40 [ mutated-objects get in? ]
43 M: ##write-barrier eliminate-write-barrier
44 src>> needs-write-barrier? ;
46 M: ##write-barrier-imm eliminate-write-barrier
47 src>> needs-write-barrier? ;
49 M: gc-map-insn eliminate-write-barrier
50 fresh-allocations get clear-set ;
52 M: ##copy eliminate-write-barrier
53 [ src>> resolve-copy ] [ dst>> ] bi copies get set-at t ;
55 M: insn eliminate-write-barrier drop t ;
57 : write-barriers-step ( insns -- insns' )
58 HS{ } clone fresh-allocations set
59 HS{ } clone mutated-objects set
61 [ eliminate-write-barrier ] filter! ;
63 : eliminate-write-barriers ( cfg -- )
64 [ write-barriers-step ] simple-optimization ;