collapse slice of a slice; %fast-set-slot linearizer was buggy

cvs
Slava Pestov 2005-08-16 03:09:44 +00:00
parent dcdedf2e90
commit f8c2daad8b
8 changed files with 41 additions and 29 deletions

View File

@ -12,6 +12,9 @@
<li>Optimizing out conditionals where the test value is a constant.</li> <li>Optimizing out conditionals where the test value is a constant.</li>
<li>Optimizing out type checks that are always/never satisfied.</li> <li>Optimizing out type checks that are always/never satisfied.</li>
<li>Inlining method bodies when generic words are called on values with known compile-time types.</li> <li>Inlining method bodies when generic words are called on values with known compile-time types.</li>
<li>Side-effect-free words that output immutable values are evaluated at compile time if all their inputs are literal. You can declare a word as having this condition by suffixing the definition with <code>foldable</code>, eg:
<pre>: cube dup dup * * ; foldable</pre></li>
<li>Various arithmetic identities such as <code>1 *</code> are optimized out.
</ul> </ul>
</li> </li>

View File

@ -26,7 +26,12 @@ M: reversed thaw ( seq -- seq ) delegate reverse ;
! A slice of another sequence. ! A slice of another sequence.
TUPLE: slice seq from to step ; TUPLE: slice seq from to step ;
: collapse-slice ( from to slice -- from to seq )
dup slice-from swap slice-seq >r tuck + >r + r> r> ;
C: slice ( from to seq -- seq ) C: slice ( from to seq -- seq )
#! A slice of a slice collapses.
>r dup slice? [ collapse-slice ] when r>
[ set-slice-seq ] keep [ set-slice-seq ] keep
>r 2dup > -1 1 ? r> >r 2dup > -1 1 ? r>
[ set-slice-step ] keep [ set-slice-step ] keep

View File

@ -54,28 +54,28 @@ sequences vectors words ;
out-1 out-1
] "intrinsic" set-word-prop ] "intrinsic" set-word-prop
: value-types drop f ; : node-peek ( node -- value ) node-in-d peek ;
: node-peek ( node -- obj ) node-in-d peek ; : value-tag ( value node -- n/f )
#! If the tag is known, output it, otherwise f.
node-classes hash dup [
types [ type-tag ] map dup [ = ] every?
[ first ] [ drop f ] ifte
] [
drop f
] ifte ;
: peek-2 dup length 2 - swap nth ; : slot@ ( node -- n/f )
: node-peek-2 ( node -- obj ) node-in-d peek-2 ;
: typed? ( value -- ? ) value-types length 1 = ;
: slot@ ( node -- n )
#! Compute slot offset. #! Compute slot offset.
node-in-d dup node-in-d reverse dup first dup literal? [
dup peek literal-value cell * literal-value cell * swap second
swap peek-2 value-types car type-tag - ; rot value-tag dup [ - ] [ 2drop f ] ifte
] [
: typed-literal? ( node -- ? ) 3drop f
#! Output if the node's first input is well-typed, and the ] ifte ;
#! second is a literal.
dup node-peek literal? swap node-peek-2 typed? and ;
\ slot [ \ slot [
dup typed-literal? [ dup slot@ [
1 %dec-d , 1 %dec-d ,
in-1 in-1
0 swap slot@ %fast-slot , 0 swap slot@ %fast-slot ,
@ -89,20 +89,19 @@ sequences vectors words ;
] "intrinsic" set-word-prop ] "intrinsic" set-word-prop
\ set-slot [ \ set-slot [
dup typed-literal? [ dup slot@ [
1 %dec-d , 1 %dec-d ,
in-2 in-2
2 %dec-d , 2 %dec-d ,
slot@ >r 0 1 r> %fast-set-slot , slot@ >r 0 1 r> %fast-set-slot ,
0 %write-barrier ,
] [ ] [
drop drop
in-3 in-3
3 %dec-d , 3 %dec-d ,
1 %untag , 1 %untag ,
0 1 2 %set-slot , 0 1 2 %set-slot ,
1 %write-barrier ,
] ifte ] ifte
1 %write-barrier ,
] "intrinsic" set-word-prop ] "intrinsic" set-word-prop
\ type [ \ type [

View File

@ -36,6 +36,8 @@ SYMBOL: null
#! Test if class1 is a subclass of class2. #! Test if class1 is a subclass of class2.
{ {
{ [ 2dup eq? ] [ 2drop t ] } { [ 2dup eq? ] [ 2drop t ] }
{ [ over types empty? ] [ 2drop t ] }
{ [ dup types empty? ] [ 2drop f ] }
{ [ dup custom-class< ] [ dup custom-class< call ] } { [ dup custom-class< ] [ dup custom-class< call ] }
{ [ t ] [ 2types contained? ] } { [ t ] [ 2types contained? ] }
} cond ; } cond ;

View File

@ -31,7 +31,7 @@ predicate [
over metaclass over metaclass eq? [ over metaclass over metaclass eq? [
>r "superclass" word-prop r> class< >r "superclass" word-prop r> class<
] [ ] [
drop types empty? 2drop f
] ifte ] ifte
] "class<" set-word-prop ] "class<" set-word-prop

View File

@ -12,6 +12,9 @@ math-internals test words ;
[ 3 ] [ 3 1 2 [ cons [ 1 set-slot ] keep ] compile-1 cdr ] unit-test [ 3 ] [ 3 1 2 [ cons [ 1 set-slot ] keep ] compile-1 cdr ] unit-test
[ 3 ] [ [ 3 1 2 cons [ 1 set-slot ] keep ] compile-1 cdr ] unit-test [ 3 ] [ [ 3 1 2 cons [ 1 set-slot ] keep ] compile-1 cdr ] unit-test
! Write barrier hits on the wrong value were causing segfaults
[ -3 ] [ -3 1 2 [ cons [ 1 set-slot ] keep ] compile-1 cdr ] unit-test
[ ] [ 1 [ drop ] compile-1 ] unit-test [ ] [ 1 [ drop ] compile-1 ] unit-test
[ ] [ [ 1 drop ] compile-1 ] unit-test [ ] [ [ 1 drop ] compile-1 ] unit-test
[ ] [ [ 1 2 2drop ] compile-1 ] unit-test [ ] [ [ 1 2 2drop ] compile-1 ] unit-test

View File

@ -8,8 +8,8 @@ USING: kernel lists math sequences strings test vectors ;
[ { 2 3 } ] [ 1 3 { 1 2 3 4 } <slice> >vector ] unit-test [ { 2 3 } ] [ 1 3 { 1 2 3 4 } <slice> >vector ] unit-test
[ { 4 5 } ] [ 2 { 1 2 3 4 5 } tail-slice* >vector ] unit-test [ { 4 5 } ] [ 2 { 1 2 3 4 5 } tail-slice* >vector ] unit-test
[ { 1 2 } { 3 4 } ] [ 2 { 1 2 3 4 } cut ] unit-test [ { 1 2 } { 3 4 } ] [ 2 { 1 2 3 4 } cut ] unit-test
[ { 3 4 } ] [ 2 4 1 10 <range> subseq ] unit-test [ { 3 4 } ] [ 2 4 1 10 <range> subseq >vector ] unit-test
[ { 3 4 } ] [ 0 2 2 4 1 10 <range> <slice> subseq ] unit-test [ { 3 4 } ] [ 0 2 2 4 1 10 <range> <slice> subseq >vector ] unit-test
[ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test [ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test
[ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test [ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test

View File

@ -72,7 +72,7 @@ SYMBOL: failures
prepare-tests [ test ] subset terpri passed. failed. ; prepare-tests [ test ] subset terpri passed. failed. ;
: tests : tests
[ {
"lists/cons" "lists/lists" "lists/assoc" "lists/cons" "lists/lists" "lists/assoc"
"lists/namespaces" "lists/queues" "lists/namespaces" "lists/queues"
"combinators" "combinators"
@ -91,26 +91,26 @@ SYMBOL: failures
"gadgets/gradients" "memory" "gadgets/gradients" "memory"
"redefine" "annotate" "sequences" "binary" "inspector" "redefine" "annotate" "sequences" "binary" "inspector"
"kernel" "kernel"
] run-tests ; } run-tests ;
: benchmarks : benchmarks
[ {
"benchmark/empty-loop" "benchmark/fac" "benchmark/empty-loop" "benchmark/fac"
"benchmark/fib" "benchmark/sort" "benchmark/fib" "benchmark/sort"
"benchmark/continuations" "benchmark/ack" "benchmark/continuations" "benchmark/ack"
"benchmark/hashtables" "benchmark/strings" "benchmark/hashtables" "benchmark/strings"
"benchmark/vectors" "benchmark/prettyprint" "benchmark/vectors" "benchmark/prettyprint"
"benchmark/image" "benchmark/image"
] run-tests ; } run-tests ;
: compiler-tests : compiler-tests
[ {
"io/buffer" "compiler/optimizer" "io/buffer" "compiler/optimizer"
"compiler/simple" "compiler/simple"
"compiler/stack" "compiler/ifte" "compiler/stack" "compiler/ifte"
"compiler/generic" "compiler/bail-out" "compiler/generic" "compiler/bail-out"
"compiler/linearizer" "compiler/intrinsics" "compiler/linearizer" "compiler/intrinsics"
"compiler/identities" "compiler/identities"
] run-tests ; } run-tests ;
: all-tests tests compiler-tests benchmarks ; : all-tests tests compiler-tests benchmarks ;