optimize literals on either size of a shuffle

cvs
Slava Pestov 2005-09-08 02:50:08 +00:00
parent b89f80e95e
commit 599c985fac
8 changed files with 28 additions and 39 deletions

View File

@ -53,12 +53,6 @@ M: object load-value ( vreg n value -- )
M: literal load-value ( vreg n value -- ) M: literal load-value ( vreg n value -- )
nip push-literal ; nip push-literal ;
: push-1 ( value -- ) 0 swap push-literal ;
M: #push linearize-node* ( node -- )
node-out-d dup length dup %inc-d,
1 - swap [ push-1 0 over %replace-d , ] each drop ;
: ifte-head ( label -- ) : ifte-head ( label -- )
in-1 -1 %inc-d, 0 %jump-t , ; in-1 -1 %inc-d, 0 %jump-t , ;

View File

@ -121,12 +121,12 @@ C: %end-dispatch make-vop ;
! stack operations ! stack operations
TUPLE: %peek-d ; TUPLE: %peek-d ;
C: %peek-d make-vop ; C: %peek-d make-vop ;
: %peek-d ( vreg n -- ) swap <vreg> src/dest-vop <%peek-d> ; : %peek-d ( vreg n -- vop ) swap <vreg> src/dest-vop <%peek-d> ;
M: %peek-d basic-block? drop t ; M: %peek-d basic-block? drop t ;
TUPLE: %replace-d ; TUPLE: %replace-d ;
C: %replace-d make-vop ; C: %replace-d make-vop ;
: %replace-d ( vreg n -- ) swap <vreg> 2-in-vop <%replace-d> ; : %replace-d ( vreg n -- vop ) swap <vreg> 2-in-vop <%replace-d> ;
M: %replace-d basic-block? drop t ; M: %replace-d basic-block? drop t ;
TUPLE: %inc-d ; TUPLE: %inc-d ;
@ -138,17 +138,17 @@ M: %inc-d basic-block? drop t ;
TUPLE: %immediate ; TUPLE: %immediate ;
C: %immediate make-vop ; C: %immediate make-vop ;
: %immediate ( vreg obj -- ) : %immediate ( vreg obj -- vop )
swap <vreg> src/dest-vop <%immediate> ; swap <vreg> src/dest-vop <%immediate> ;
M: %immediate basic-block? drop t ; M: %immediate basic-block? drop t ;
TUPLE: %peek-r ; TUPLE: %peek-r ;
C: %peek-r make-vop ; C: %peek-r make-vop ;
: %peek-r ( vreg n -- ) swap <vreg> src/dest-vop <%peek-r> ; : %peek-r ( vreg n -- vop ) swap <vreg> src/dest-vop <%peek-r> ;
TUPLE: %replace-r ; TUPLE: %replace-r ;
C: %replace-r make-vop ; C: %replace-r make-vop ;
: %replace-r ( vreg n -- ) swap <vreg> 2-in-vop <%replace-r> ; : %replace-r ( vreg n -- vop ) swap <vreg> 2-in-vop <%replace-r> ;
TUPLE: %inc-r ; TUPLE: %inc-r ;
C: %inc-r make-vop ; C: %inc-r make-vop ;

View File

@ -117,8 +117,9 @@ M: #call infer-classes* ( node -- )
drop drop
] ifte ; ] ifte ;
M: #push infer-classes* ( node -- ) M: #shuffle infer-classes* ( node -- )
node-out-d dup [ literal-value ] map swap assume-literals ; node-out-d [ literal? ] subset
dup [ literal-value ] map swap assume-literals ;
M: #ifte child-ties ( node -- seq ) M: #ifte child-ties ( node -- seq )
node-in-d first dup general-t <class-tie> node-in-d first dup general-t <class-tie>

View File

@ -95,13 +95,10 @@ TUPLE: #call-label ;
C: #call-label make-node ; C: #call-label make-node ;
: #call-label ( label -- node ) param-node <#call-label> ; : #call-label ( label -- node ) param-node <#call-label> ;
TUPLE: #push ;
C: #push make-node ;
: #push ( outputs -- node ) d-tail out-d-node <#push> ;
TUPLE: #shuffle ; TUPLE: #shuffle ;
C: #shuffle make-node ; C: #shuffle make-node ;
: #shuffle ( -- node ) empty-node <#shuffle> ; : #shuffle ( -- node ) empty-node <#shuffle> ;
: #push ( outputs -- node ) d-tail out-d-node <#shuffle> ;
TUPLE: #values ; TUPLE: #values ;
C: #values make-node ; C: #values make-node ;

View File

@ -41,12 +41,10 @@ M: node literals* ( node -- ) drop { } ;
M: node can-kill* ( literal node -- ? ) M: node can-kill* ( literal node -- ? )
uses-value? not ; uses-value? not ;
! #push
M: #push literals* ( node -- ) node-out-d ;
M: #push can-kill* ( literal node -- ? ) 2drop t ;
! #shuffle ! #shuffle
M: #shuffle literals* ( node -- )
node-out-d [ literal? ] subset ;
M: #shuffle can-kill* ( literal node -- ? ) 2drop t ; M: #shuffle can-kill* ( literal node -- ? ) 2drop t ;
! #call-label ! #call-label

View File

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

View File

@ -16,21 +16,22 @@ M: comment pprint* ( ann -- )
: comment, ( ? node text -- ) : comment, ( ? node text -- )
rot [ <comment> , ] [ 2drop ] ifte ; rot [ <comment> , ] [ 2drop ] ifte ;
: value-str ( prefix values -- str ) : values% ( prefix values -- )
[ value-uid word-name append ] map-with concat ; [
swap %
dup literal? [ literal-value ] [ value-uid ] ifte
unparse %
] each-with ;
: effect-str ( node -- str ) : effect-str ( node -- str )
[ [
" " over node-in-d value-str % " " over node-in-d values%
" r: " over node-in-r value-str % " r: " over node-in-r values%
" --" % " --" %
" " over node-out-d value-str % " " over node-out-d values%
" r: " swap node-out-r value-str % " r: " swap node-out-r values%
] "" make 1 swap tail ; ] "" make 1 swap tail ;
M: #push node>quot ( ? node -- )
node-out-d [ literal-value literalize ] map % drop ;
M: #shuffle node>quot ( ? node -- ) M: #shuffle node>quot ( ? node -- )
>r drop t r> dup effect-str "#shuffle: " swap append comment, ; >r drop t r> dup effect-str "#shuffle: " swap append comment, ;

View File

@ -10,8 +10,12 @@ TUPLE: shuffle in-d in-r out-d out-r ;
: load-shuffle ( d r shuffle -- ) : load-shuffle ( d r shuffle -- )
tuck shuffle-in-r [ set ] 2each shuffle-in-d [ set ] 2each ; tuck shuffle-in-r [ set ] 2each shuffle-in-d [ set ] 2each ;
: shuffled-values ( values -- values )
[ dup literal? [ get ] unless ] map ;
: store-shuffle ( shuffle -- d r ) : store-shuffle ( shuffle -- d r )
dup shuffle-out-d [ get ] map swap shuffle-out-r [ get ] map ; dup shuffle-out-d shuffled-values
swap shuffle-out-r shuffled-values ;
: shuffle* ( d r shuffle -- d r ) : shuffle* ( d r shuffle -- d r )
[ [ load-shuffle ] keep store-shuffle ] with-scope ; [ [ load-shuffle ] keep store-shuffle ] with-scope ;