optimizer-changed get
] with-node-iterator [ optimize ] when ;
-: prune-if ( node quot -- successor/t )
- over >r call [ r> node-successor ] [ r> drop t ] if ;
- inline
-
! Generic nodes
M: f optimize-node* drop t ;
M: node optimize-node* ( node -- t ) drop t ;
-! #shuffle
-: can-compose? ( shuffle -- ? )
- dup shuffle-in-d length swap shuffle-in-r length +
- vregs length <= ;
-
-: compose-shuffle-nodes ( #shuffle #shuffle -- #shuffle/t )
- [ [ node-shuffle ] 2apply compose-shuffle ] keep
- over can-compose?
- [ [ set-node-shuffle ] keep ] [ 2drop t ] if ;
-
-M: #shuffle optimize-node* ( node -- node/t )
- dup node-successor dup #shuffle? [
- compose-shuffle-nodes
- ] [
- drop [
- dup node-in-d over node-out-d sequence=
- >r dup node-in-r swap node-out-r sequence= r> and
- ] prune-if
- ] if ;
-
! #push
M: #push optimize-node* ( node -- node/t )
- [ node-out-d empty? ] prune-if ;
+ dup node-out-d empty? [ node-successor ] [ drop t ] if ;
! #return
M: #return optimize-node* ( node -- node/t )
#! the shuffle.
[ split-shuffle ] keep shuffle* join-shuffle ;
-: fix-compose-d ( s1 s2 -- )
- over shuffle-out-d over shuffle-in-d [ length ] 2apply < [
- over shuffle-out-d length over shuffle-in-d head*
- [ pick shuffle-in-d append pick set-shuffle-in-d ] keep
- pick shuffle-out-d append pick set-shuffle-out-d
- ] when 2drop ;
-
-: fix-compose-r ( s1 s2 -- )
- over shuffle-out-r over shuffle-in-r [ length ] 2apply < [
- over shuffle-out-r length over shuffle-in-r head*
- [ pick shuffle-in-r append pick set-shuffle-in-r ] keep
- pick shuffle-out-r append pick set-shuffle-out-r
- ] when 2drop ;
-
-: compose-shuffle ( s1 s2 -- s1+s2 )
- #! s1's d and r output lengths must be at least the required
- #! length for the shuffle. If they are not, a special
- #! behavior is used which is only valid for the optimizer.
- [ clone ] 2apply 2dup fix-compose-d 2dup fix-compose-r
- >r dup shuffle-out-d over shuffle-out-r r> shuffle
- >r >r dup shuffle-in-d swap shuffle-in-r r> r> <shuffle> ;
-
M: shuffle clone ( shuffle -- shuffle )
[ shuffle-in-d clone ] keep
[ shuffle-in-r clone ] keep
] if
] with-scope ; compiled
-[ 9227465 ] [ 34 namespace-fib ] unit-test
+[ 1346269 ] [ 30 namespace-fib ] unit-test
USE: words
USE: kernel
USE: sequences
+USE: io
-[ ] [ vocabs [ words [ see ] each ] each ] unit-test
+[ ] [
+ [ vocabs [ words [ see ] each ] each ] string-out drop
+] unit-test
USING: compiler kernel math sequences test ;
: sort-benchmark
- 100000 [ drop 100000 random-int ] map number-sort drop ; compiled
+ 100000 [ drop 100000 random-int ] map natural-sort drop ; compiled
[ ] [ sort-benchmark ] unit-test