factor/library/inference/optimizer.factor

97 lines
2.5 KiB
Factor
Raw Normal View History

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-09-09 00:17:19 -04:00
IN: optimizer
2005-09-05 17:36:20 -04:00
USING: compiler-backend generic hashtables inference kernel
2005-09-04 19:52:50 -04:00
lists math 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
GENERIC: optimize-node* ( node -- node/t )
2005-05-21 16:05:39 -04:00
: keep-optimizing ( node -- node ? )
2005-07-27 01:46:06 -04:00
dup optimize-node* dup t =
2005-09-24 15:21:17 -04:00
[ drop f ] [ nip keep-optimizing t or ] if ;
2005-05-22 02:35:38 -04:00
DEFER: optimize-node
: optimize-children ( node -- ? )
2005-09-17 04:15:05 -04:00
f swap [
node-children [ optimize-node swap >r or r> ] map
] keep set-node-children ;
: 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
2005-09-24 15:21:17 -04:00
] [ r> ] if ;
2005-05-21 16:05:39 -04:00
2005-09-14 00:37:50 -04:00
: optimize-1 ( dataflow -- dataflow ? )
2005-08-07 00:00:57 -04:00
recursive-state off
dup kill-set over kill-node
dup infer-classes
2005-09-14 00:37:50 -04:00
optimize-node ;
: optimize-loop ( dataflow -- dataflow )
optimize-1 [ optimize-loop ] when ;
2005-08-07 00:00:57 -04:00
2005-05-21 16:05:39 -04:00
: optimize ( dataflow -- dataflow )
[
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 )
2005-09-24 15:21:17 -04:00
over >r call [ r> node-successor ] [ r> drop t ] if ;
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-09-04 17:07:59 -04:00
! #shuffle
2005-09-04 19:52:50 -04:00
: compose-shuffle-nodes ( #shuffle #shuffle -- #shuffle/t )
[ [ node-shuffle ] 2apply compose-shuffle ] keep
2005-09-04 19:52:50 -04:00
over shuffle-in-d length pick shuffle-in-r length + vregs > [
2drop t
] [
[ set-node-shuffle ] keep
2005-09-24 15:21:17 -04:00
] if ;
2005-09-04 19:52:50 -04:00
2005-09-04 17:07:59 -04:00
M: #shuffle optimize-node* ( node -- node/t )
dup node-successor dup #shuffle? [
2005-09-04 19:52:50 -04:00
compose-shuffle-nodes
] [
2005-09-10 00:55:46 -04:00
drop [
dup node-in-d over node-out-d =
2005-09-24 15:21:17 -04:00
[ dup node-in-r swap node-out-r = ] [ drop f ] if
2005-09-10 00:55:46 -04:00
] prune-if
2005-09-24 15:21:17 -04:00
] if ;
2005-05-21 16:05:39 -04:00
2005-09-24 15:21:17 -04:00
! #if
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 )
over drop-inputs
[ >r swap node-children nth r> set-node-successor ] keep ;
2005-07-27 01:46:06 -04:00
2005-09-24 15:21:17 -04:00
M: #if optimize-node* ( node -- node )
2005-07-27 01:46:06 -04:00
dup static-branch?
2005-09-24 15:21:17 -04:00
[ literal-value 0 1 ? static-branch ] [ 2drop t ] if ;
2005-07-27 01:46:06 -04:00
2005-08-13 04:01:21 -04:00
! #values
: optimize-fold ( node -- node/t )
2005-09-24 15:21:17 -04:00
node-successor [ node-successor ] [ t ] if* ;
2005-07-27 01:46:06 -04:00
M: #values optimize-node* ( node -- node/t )
optimize-fold ;
2005-08-13 04:01:21 -04:00
! #return
M: #return optimize-node* ( node -- node/t )
optimize-fold ;