]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/write-barrier/write-barrier.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / compiler / cfg / write-barrier / write-barrier.factor
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
6
7 ! Eliminate redundant write barrier hits.
8
9 ! Objects which have already been marked, as well as
10 ! freshly-allocated objects
11 SYMBOL: safe
12
13 ! Objects which have been mutated
14 SYMBOL: mutated
15
16 GENERIC: eliminate-write-barrier ( insn -- ? )
17
18 M: ##allot eliminate-write-barrier
19     dst>> safe get conjoin t ;
20
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 ;
24
25 M: ##set-slot eliminate-write-barrier
26     obj>> mutated get conjoin t ;
27
28 M: ##set-slot-imm eliminate-write-barrier
29     obj>> mutated get conjoin t ;
30
31 M: insn eliminate-write-barrier drop t ;
32
33 : write-barriers-step ( bb -- )
34     H{ } clone safe set
35     H{ } clone mutated set
36     instructions>> [ eliminate-write-barrier ] filter-here ;
37
38 : eliminate-write-barriers ( cfg -- cfg' )
39     dup [ write-barriers-step ] each-basic-block ;