2006-03-02 01:12:32 -05:00
|
|
|
! Copyright (C) 2004, 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-09-09 00:17:19 -04:00
|
|
|
IN: optimizer
|
2006-03-04 02:53:22 -05:00
|
|
|
USING: compiler-backend generic hashtables inference io kernel
|
2005-12-17 09:55:00 -05:00
|
|
|
lists math namespaces sequences vectors ;
|
2005-08-03 18:47:32 -04:00
|
|
|
|
2006-03-06 19:19:20 -05:00
|
|
|
SYMBOL: optimizer-changed
|
|
|
|
|
2005-09-16 20:49:24 -04:00
|
|
|
GENERIC: optimize-node* ( node -- node/t )
|
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-09-24 15:21:17 -04:00
|
|
|
[ drop f ] [ nip keep-optimizing t or ] if ;
|
2005-05-22 02:35:38 -04:00
|
|
|
|
2006-03-06 19:19:20 -05:00
|
|
|
: optimize-node ( node -- node )
|
|
|
|
[
|
|
|
|
keep-optimizing [ optimizer-changed on ] when
|
|
|
|
] map-nodes ;
|
|
|
|
|
|
|
|
: optimize ( node -- node )
|
|
|
|
dup kill-values dup infer-classes [
|
|
|
|
optimizer-changed off
|
|
|
|
optimize-node
|
|
|
|
optimizer-changed get
|
|
|
|
] with-node-iterator [ optimize ] when ;
|
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 ;
|
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
|
|
|
|
2006-03-05 19:42:14 -05: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-12-04 22:06:12 -05:00
|
|
|
: can-compose? ( shuffle -- ? )
|
|
|
|
dup shuffle-in-d length swap shuffle-in-r length +
|
|
|
|
vregs length <= ;
|
|
|
|
|
2005-09-04 19:52:50 -04:00
|
|
|
: compose-shuffle-nodes ( #shuffle #shuffle -- #shuffle/t )
|
2005-09-16 20:49:24 -04:00
|
|
|
[ [ node-shuffle ] 2apply compose-shuffle ] keep
|
2005-12-04 22:06:12 -05:00
|
|
|
over can-compose?
|
|
|
|
[ [ set-node-shuffle ] keep ] [ 2drop t ] if ;
|
2005-09-04 19:52:50 -04:00
|
|
|
|
2005-09-04 17:07:59 -04:00
|
|
|
M: #shuffle optimize-node* ( node -- node/t )
|
2005-09-04 19:24:24 -04:00
|
|
|
dup node-successor dup #shuffle? [
|
2005-09-04 19:52:50 -04:00
|
|
|
compose-shuffle-nodes
|
2005-09-04 19:24:24 -04:00
|
|
|
] [
|
2005-09-10 00:55:46 -04:00
|
|
|
drop [
|
2005-11-27 22:18:17 -05:00
|
|
|
dup node-in-d over node-out-d sequence=
|
|
|
|
>r dup node-in-r swap node-out-r sequence= r> and
|
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-08-13 04:01:21 -04:00
|
|
|
! #return
|
2005-08-11 19:08:22 -04:00
|
|
|
M: #return optimize-node* ( node -- node/t )
|
2006-03-06 23:35:32 -05:00
|
|
|
node-successor [ node-successor ] [ t ] if* ;
|