factor/basis/compiler/tree/escape-analysis/allocations/allocations.factor

140 lines
3.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2008, 2009 Slava Pestov.
2008-08-02 00:31:43 -04:00
! 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.values ;
2008-08-02 00:31:43 -04:00
IN: compiler.tree.escape-analysis.allocations
! A map from values to classes. Only for #introduce outputs
SYMBOL: value-classes
: value-class ( value -- class ) value-classes get at ;
: set-value-class ( class value -- ) value-classes get set-at ;
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-02 00:31:43 -04:00
SYMBOL: allocations
2008-08-04 05:35:31 -04:00
: (allocation) ( value -- value' allocations )
2008-08-07 07:34:28 -04:00
allocations get ; inline
2008-08-04 05:35:31 -04:00
: allocation ( value -- allocation )
2008-08-08 14:14:36 -04:00
(allocation) at ;
2008-08-02 00:31:43 -04:00
2008-08-07 07:34:28 -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-08 14:14:36 -04:00
! We track slot access to connect constructor inputs with
! accessor outputs.
SYMBOL: slot-accesses
TUPLE: slot-access slot# value ;
C: <slot-access> slot-access
: record-slot-access ( out slot# in -- )
<slot-access> swap slot-accesses get set-at ;
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-07 07:34:28 -04:00
<escaping-values> escaping-values set ;
: introduce-value ( values -- )
2008-08-08 14:14:36 -04:00
escaping-values get
2dup disjoint-set-member?
[ 2drop ] [ add-atom ] if ;
2008-08-07 07:34:28 -04:00
: introduce-values ( values -- )
2008-08-08 14:14:36 -04:00
[ introduce-value ] each ;
2008-08-03 22:32:12 -04:00
: <slot-value> ( -- value )
2008-08-08 14:14:36 -04:00
<value> dup introduce-value ;
2008-08-02 00:31:43 -04:00
2008-08-03 22:32:12 -04:00
: merge-values ( in-values out-value -- )
2008-08-13 15:17:04 -04:00
escaping-values get equate-all-with ;
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 07:34:28 -04:00
: equate-values ( value1 value2 -- )
escaping-values get equate ;
: add-escaping-value ( value -- )
2008-08-08 14:14:36 -04:00
[
allocation {
{ [ dup not ] [ drop ] }
{ [ dup t eq? ] [ drop ] }
[ [ add-escaping-value ] each ]
} cond
]
[ +escaping+ equate-values ] bi ;
2008-08-03 22:32:12 -04:00
: add-escaping-values ( values -- )
2008-08-08 14:14:36 -04:00
[ add-escaping-value ] each ;
2008-08-02 21:21:25 -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
2008-08-07 07:34:28 -04:00
DEFER: copy-value
: copy-allocation ( allocation -- allocation' )
{
{ [ dup not ] [ ] }
{ [ dup t eq? ] [ ] }
[ [ <value> [ introduce-value ] [ copy-value ] [ ] tri ] map ]
} cond ;
: copy-value ( from to -- )
[ equate-values ]
[ [ allocation copy-allocation ] dip record-allocation ]
2bi ;
: copy-values ( from to -- )
[ copy-value ] 2each ;
2008-08-08 14:14:36 -04:00
: copy-slot-value ( out slot# in -- )
allocation {
{ [ dup not ] [ 3drop ] }
{ [ dup t eq? ] [ 3drop ] }
[ nth swap copy-value ]
} cond ;
! Compute which tuples escape
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? ;
2008-08-07 07:34:28 -04:00
: unboxed-allocation ( value -- allocation/f )
dup escaping-allocation? [ drop f ] [ allocation ] if ;
: unboxed-slot-access? ( value -- ? )
2008-08-08 14:14:36 -04:00
slot-accesses get at*
[ value>> unboxed-allocation >boolean ] when ;