1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators disjoint-sets fry kernel
4 namespaces sequences stack-checker.values ;
5 IN: compiler.tree.escape-analysis.allocations
9 : value-class ( value -- class ) value-classes get at ;
11 : set-value-class ( class value -- ) value-classes get set-at ;
15 : allocation ( value -- allocation )
18 : record-allocation ( allocation value -- )
19 allocations get set-at ;
21 : record-allocations ( allocations values -- )
22 allocations get '[ _ set-at ] 2each ;
26 TUPLE: slot-access slot# value ;
28 C: <slot-access> slot-access
30 : record-slot-access ( out slot# in -- )
31 <slot-access> swap slot-accesses get set-at ;
33 SYMBOL: escaping-values
37 : <escaping-values> ( -- disjoint-set )
38 <disjoint-set> +escaping+ over add-atom ;
40 : init-escaping-values ( -- )
41 <escaping-values> escaping-values set ;
43 : (introduce-value) ( values escaping-values -- )
44 2dup disjoint-set-member?
45 [ 2drop ] [ add-atom ] if ; inline
47 : introduce-value ( values -- )
48 escaping-values get (introduce-value) ;
50 : introduce-values ( values -- )
51 escaping-values get '[ _ (introduce-value) ] each ;
53 : <slot-value> ( -- value )
54 <value> dup introduce-value ;
56 : merge-values ( in-values out-value -- )
57 escaping-values get equate-all-with ;
59 : merge-slots ( values -- value )
60 <slot-value> [ merge-values ] keep ;
62 : equate-values ( value1 value2 -- )
63 escaping-values get equate ;
65 DEFER: add-escaping-values
67 : add-escaping-value ( value -- )
68 [ allocation dup boolean? [ drop ] [ add-escaping-values ] if ]
69 [ +escaping+ equate-values ] bi ;
71 : add-escaping-values ( values -- )
72 [ add-escaping-value ] each ;
74 : unknown-allocation ( value -- )
75 [ add-escaping-value ]
76 [ t swap record-allocation ]
79 : unknown-allocations ( values -- )
80 [ unknown-allocation ] each ;
82 : (escaping-value?) ( value escaping-values -- ? )
83 +escaping+ swap equiv? ; inline
85 : escaping-value? ( value -- ? )
86 escaping-values get (escaping-value?) ;
90 : copy-allocation ( allocation -- allocation' )
92 [ <value> [ introduce-value ] [ copy-value ] [ ] tri ] map
95 :: (copy-value) ( from to allocations -- )
97 from allocations at copy-allocation to allocations set-at ;
99 : copy-value ( from to -- )
100 allocations get (copy-value) ;
102 : copy-values ( from to -- )
103 allocations get '[ _ (copy-value) ] 2each ;
105 : copy-slot-value ( out slot# in -- )
106 allocation dup boolean?
107 [ 3drop ] [ nth swap copy-value ] if ;
109 SYMBOL: escaping-allocations
111 : compute-escaping-allocations ( -- )
112 allocations get escaping-values get
113 '[ _ (escaping-value?) ] filter-keys
114 escaping-allocations set ;
116 : escaping-allocation? ( value -- ? )
117 escaping-allocations get key? ;
119 : unboxed-allocation ( value -- allocation/f )
120 dup escaping-allocation? [ drop f ] [ allocation ] if ;
122 : unboxed-slot-access? ( value -- ? )
123 slot-accesses get at*
124 [ value>> unboxed-allocation >boolean ] when ;