cvs
Slava Pestov 2005-09-10 04:55:46 +00:00
parent 55299ac101
commit 64b89e3e84
4 changed files with 21 additions and 7 deletions

View File

@ -46,8 +46,20 @@ M: #label linearize* ( node -- )
dup <label> [ %return-to , simple-label ] keep %label , dup <label> [ %return-to , simple-label ] keep %label ,
] ifte linearize-next ; ] ifte linearize-next ;
: tail-call? ( node -- ? )
#! A #call to some other label or word, followed by a
#! #return from a simple label is not allowed to be
#! tail-call-optimized; indeed, that #return will not be
#! generated at all.
dup node-successor dup #return? [
swap node-param swap node-param
dup simple-labels get memq? not >r eq? r> or
] [
2drop f
] ifte ;
: ?tail-call ( node caller jumper -- next ) : ?tail-call ( node caller jumper -- next )
>r >r dup node-successor #return? [ >r >r dup tail-call? [
node-param r> drop r> execute , node-param r> drop r> execute ,
] [ ] [
dup node-param r> execute , r> drop linearize-next dup node-param r> execute , r> drop linearize-next
@ -104,6 +116,4 @@ M: #dispatch linearize* ( vtable -- )
M: #return linearize* ( node -- ) M: #return linearize* ( node -- )
#! Simple label returns do not count, since simple labels do #! Simple label returns do not count, since simple labels do
#! not push a stack frame on the C stack. #! not push a stack frame on the C stack.
dup node-param simple-labels get memq? [ node-param simple-labels get memq? [ %return , ] unless ;
f %return ,
] unless drop ;

View File

@ -75,7 +75,7 @@ C: %label make-vop ;
! simplifier. ! simplifier.
TUPLE: %return ; TUPLE: %return ;
C: %return make-vop ; C: %return make-vop ;
: %return ( label) label-vop <%return> ; : %return empty-vop <%return> ;
TUPLE: %return-to ; TUPLE: %return-to ;
C: %return-to make-vop ; C: %return-to make-vop ;

View File

@ -63,7 +63,10 @@ M: #shuffle optimize-node* ( node -- node/t )
dup node-successor dup #shuffle? [ dup node-successor dup #shuffle? [
compose-shuffle-nodes compose-shuffle-nodes
] [ ] [
drop [ node-values empty? ] prune-if drop [
dup node-in-d over node-out-d =
>r dup node-in-r swap node-out-r = r> and
] prune-if
] ifte ; ] ifte ;
! #ifte ! #ifte

View File

@ -57,7 +57,8 @@ M: #dispatch node>quot ( ? node -- )
[ "#dispatch" comment, ] 2keep [ "#dispatch" comment, ] 2keep
node-children [ swap dataflow>quot ] map-with , \ dispatch , ; node-children [ swap dataflow>quot ] map-with , \ dispatch , ;
M: #return node>quot ( ? node -- ) "#return" comment, ; M: #return node>quot ( ? node -- )
dup node-param unparse "#return " swap append comment, ;
M: #values node>quot ( ? node -- ) "#values" comment, ; M: #values node>quot ( ? node -- ) "#values" comment, ;