2005-04-02 02:39:33 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-07-27 01:46:06 -04:00
|
|
|
IN: inference
|
2005-08-04 17:39:39 -04:00
|
|
|
USING: generic hashtables inference kernel lists
|
2005-08-03 18:47:32 -04:00
|
|
|
matrices namespaces sequences vectors ;
|
|
|
|
|
|
|
|
! We use the recursive-state variable here, to track nested
|
|
|
|
! label scopes, to prevent infinite loops when inlining
|
|
|
|
! recursive methods.
|
2004-12-02 22:44:36 -05:00
|
|
|
|
2005-07-27 01:46:06 -04:00
|
|
|
GENERIC: optimize-node* ( node -- node )
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
: keep-optimizing ( node -- node ? )
|
2005-07-27 01:46:06 -04:00
|
|
|
dup optimize-node* dup t =
|
2005-07-27 20:13:11 -04:00
|
|
|
[ drop f ] [ nip keep-optimizing t or ] ifte ;
|
2005-05-22 02:35:38 -04:00
|
|
|
|
2005-08-11 19:08:22 -04:00
|
|
|
DEFER: optimize-node
|
|
|
|
|
|
|
|
: optimize-children ( node -- )
|
|
|
|
f swap [
|
|
|
|
node-children [ optimize-node swap >r or r> ] map
|
|
|
|
] keep set-node-children ;
|
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
: optimize-node ( node -- node ? )
|
|
|
|
#! Outputs t if any changes were made.
|
|
|
|
keep-optimizing >r dup [
|
|
|
|
dup optimize-children >r
|
|
|
|
dup node-successor optimize-node >r
|
|
|
|
over set-node-successor r> r> r> or or
|
|
|
|
] [ r> ] ifte ;
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-08-07 00:00:57 -04:00
|
|
|
: optimize-loop ( dataflow -- dataflow )
|
|
|
|
recursive-state off
|
|
|
|
dup kill-set over kill-node
|
|
|
|
dup infer-classes
|
|
|
|
optimize-node [ optimize-loop ] when ;
|
|
|
|
|
2005-05-21 16:05:39 -04:00
|
|
|
: optimize ( dataflow -- dataflow )
|
2005-08-03 18:47:32 -04:00
|
|
|
[
|
2005-08-11 19:08:22 -04:00
|
|
|
dup solve-recursion dup split-node optimize-loop
|
2005-08-07 00:00:57 -04:00
|
|
|
] with-scope ;
|
2005-07-27 01:46:06 -04:00
|
|
|
|
|
|
|
: prune-if ( node quot -- successor/t )
|
|
|
|
over >r call [ r> node-successor ] [ r> drop t ] ifte ;
|
2005-07-27 20:13:11 -04:00
|
|
|
inline
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-05-22 02:35:38 -04:00
|
|
|
! Generic nodes
|
2005-07-27 01:46:06 -04:00
|
|
|
M: f optimize-node* drop t ;
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-07-27 01:46:06 -04:00
|
|
|
M: node optimize-node* ( node -- t )
|
|
|
|
drop t ;
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-05-22 02:35:38 -04:00
|
|
|
! #push
|
2005-07-27 01:46:06 -04:00
|
|
|
M: #push optimize-node* ( node -- node/t )
|
|
|
|
[ node-out-d empty? ] prune-if ;
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-05-22 02:35:38 -04:00
|
|
|
! #drop
|
2005-07-27 01:46:06 -04:00
|
|
|
M: #drop optimize-node* ( node -- node/t )
|
|
|
|
[ node-in-d empty? ] prune-if ;
|
2005-05-21 16:05:39 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
! #ifte
|
2005-07-27 01:46:06 -04:00
|
|
|
: static-branch? ( node -- lit ? )
|
2005-08-07 00:00:57 -04:00
|
|
|
node-in-d first dup literal? ;
|
2005-07-27 01:46:06 -04:00
|
|
|
|
|
|
|
: static-branch ( conditional n -- node )
|
2005-08-11 19:08:22 -04:00
|
|
|
over drop-inputs
|
|
|
|
[ >r swap node-children nth r> set-node-successor ] keep ;
|
2005-07-27 01:46:06 -04:00
|
|
|
|
|
|
|
M: #ifte optimize-node* ( node -- node )
|
|
|
|
dup static-branch?
|
2005-08-04 23:59:45 -04:00
|
|
|
[ literal-value 0 1 ? static-branch ] [ 2drop t ] ifte ;
|
2005-07-27 01:46:06 -04:00
|
|
|
|
2005-08-11 19:08:22 -04:00
|
|
|
! #values/#return
|
|
|
|
: optimize-fold ( node -- node/t )
|
|
|
|
#! Optimize #return/#call or #values/#merge, resulting from
|
|
|
|
#! method inlining or branch folding, respectively.
|
2005-08-12 23:54:29 -04:00
|
|
|
node-successor [ node-successor ] [ t ] ifte* ;
|
2005-07-27 01:46:06 -04:00
|
|
|
|
2005-08-12 23:54:29 -04:00
|
|
|
M: #values optimize-node* ( node -- node/t )
|
2005-08-11 19:08:22 -04:00
|
|
|
optimize-fold ;
|
|
|
|
|
|
|
|
M: #return optimize-node* ( node -- node/t )
|
|
|
|
optimize-fold ;
|