1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors namespaces assocs sets sequences
4 compiler.cfg compiler.cfg.instructions compiler.cfg.rpo ;
5 IN: compiler.cfg.write-barrier
7 ! Eliminate redundant write barrier hits.
9 ! Objects which have already been marked, as well as
10 ! freshly-allocated objects
13 ! Objects which have been mutated
16 GENERIC: eliminate-write-barrier ( insn -- ? )
18 M: ##allot eliminate-write-barrier
19 dst>> safe get conjoin t ;
21 M: ##write-barrier eliminate-write-barrier
22 src>> dup [ safe get key? not ] [ mutated get key? ] bi and
23 [ safe get conjoin t ] [ drop f ] if ;
25 M: ##set-slot eliminate-write-barrier
26 obj>> mutated get conjoin t ;
28 M: ##set-slot-imm eliminate-write-barrier
29 obj>> mutated get conjoin t ;
31 M: insn eliminate-write-barrier drop t ;
33 : write-barriers-step ( bb -- )
35 H{ } clone mutated set
36 instructions>> [ eliminate-write-barrier ] filter-here ;
38 : eliminate-write-barriers ( cfg -- cfg' )
39 dup [ write-barriers-step ] each-basic-block ;