2008-08-02 00:31:43 -04:00
|
|
|
! Copyright (C) 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-08-04 05:35:31 -04:00
|
|
|
USING: accessors assocs namespaces sequences kernel math
|
|
|
|
combinators sets disjoint-sets fry stack-checker.state
|
|
|
|
compiler.tree.copy-equiv ;
|
2008-08-02 00:31:43 -04:00
|
|
|
IN: compiler.tree.escape-analysis.allocations
|
|
|
|
|
2008-08-03 22:55:19 -04:00
|
|
|
! A map from values to one of the following:
|
|
|
|
! - f -- initial status, assigned to values we have not seen yet;
|
|
|
|
! may potentially become an allocation later
|
|
|
|
! - a sequence of values -- potentially unboxed tuple allocations
|
2008-08-04 05:35:31 -04:00
|
|
|
! - t -- not allocated in this procedure, can never be unboxed
|
2008-08-03 22:55:19 -04:00
|
|
|
|
2008-08-02 00:31:43 -04:00
|
|
|
SYMBOL: allocations
|
|
|
|
|
2008-08-04 05:35:31 -04:00
|
|
|
TUPLE: slot-access slot# value ;
|
2008-08-03 22:55:19 -04:00
|
|
|
|
2008-08-04 05:35:31 -04:00
|
|
|
C: <slot-access> slot-access
|
|
|
|
|
|
|
|
: (allocation) ( value -- value' allocations )
|
|
|
|
resolve-copy allocations get ; inline
|
|
|
|
|
|
|
|
: allocation ( value -- allocation )
|
|
|
|
(allocation) at dup slot-access? [
|
|
|
|
[ slot#>> ] [ value>> allocation ] bi nth
|
|
|
|
allocation
|
|
|
|
] when ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
2008-08-03 22:55:19 -04:00
|
|
|
: record-allocation ( allocation value -- ) (allocation) set-at ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
|
|
|
: record-allocations ( allocations values -- )
|
|
|
|
[ record-allocation ] 2each ;
|
|
|
|
|
2008-08-03 22:32:12 -04:00
|
|
|
! We track escaping values with a disjoint set.
|
|
|
|
SYMBOL: escaping-values
|
|
|
|
|
|
|
|
SYMBOL: +escaping+
|
|
|
|
|
|
|
|
: <escaping-values> ( -- disjoint-set )
|
|
|
|
<disjoint-set> +escaping+ over add-atom ;
|
|
|
|
|
|
|
|
: init-escaping-values ( -- )
|
2008-08-03 22:55:19 -04:00
|
|
|
copies get assoc>disjoint-set +escaping+ over add-atom
|
|
|
|
escaping-values set ;
|
2008-08-03 22:32:12 -04:00
|
|
|
|
|
|
|
: <slot-value> ( -- value )
|
|
|
|
<value>
|
|
|
|
[ introduce-value ]
|
|
|
|
[ escaping-values get add-atom ]
|
|
|
|
[ ]
|
|
|
|
tri ;
|
|
|
|
|
2008-08-02 00:31:43 -04:00
|
|
|
: record-slot-access ( out slot# in -- )
|
2008-08-04 05:35:31 -04:00
|
|
|
over zero? [ 3drop ] [
|
|
|
|
<slot-access> swap record-allocation
|
|
|
|
] if ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
2008-08-03 22:32:12 -04:00
|
|
|
: merge-values ( in-values out-value -- )
|
|
|
|
escaping-values get '[ , , equate ] each ;
|
2008-08-02 00:31:43 -04:00
|
|
|
|
|
|
|
: merge-slots ( values -- value )
|
2008-08-04 05:35:31 -04:00
|
|
|
<slot-value> [ merge-values ] keep ;
|
2008-08-02 21:21:25 -04:00
|
|
|
|
2008-08-07 02:08:11 -04:00
|
|
|
: add-escaping-value ( value -- )
|
|
|
|
+escaping+ escaping-values get equate ;
|
|
|
|
|
2008-08-03 22:32:12 -04:00
|
|
|
: add-escaping-values ( values -- )
|
|
|
|
escaping-values get
|
|
|
|
'[ +escaping+ , equate ] each ;
|
2008-08-02 21:21:25 -04:00
|
|
|
|
2008-08-07 02:08:11 -04:00
|
|
|
: unknown-allocation ( value -- )
|
|
|
|
[ add-escaping-value ]
|
|
|
|
[ t swap record-allocation ]
|
|
|
|
bi ;
|
|
|
|
|
|
|
|
: unknown-allocations ( values -- )
|
|
|
|
[ unknown-allocation ] each ;
|
|
|
|
|
2008-08-03 22:32:12 -04:00
|
|
|
: escaping-value? ( value -- ? )
|
|
|
|
+escaping+ escaping-values get equiv? ;
|
2008-08-03 06:01:05 -04:00
|
|
|
|
|
|
|
SYMBOL: escaping-allocations
|
|
|
|
|
|
|
|
: compute-escaping-allocations ( -- )
|
|
|
|
allocations get
|
2008-08-03 22:32:12 -04:00
|
|
|
[ drop escaping-value? ] assoc-filter
|
2008-08-03 06:01:05 -04:00
|
|
|
escaping-allocations set ;
|
2008-08-02 21:21:25 -04:00
|
|
|
|
|
|
|
: escaping-allocation? ( value -- ? )
|
2008-08-03 06:01:05 -04:00
|
|
|
escaping-allocations get key? ;
|