Debugging optimizer

db4
Slava Pestov 2008-08-18 15:47:49 -05:00
parent 2fa08c75b9
commit 9b6fb70eba
12 changed files with 82 additions and 60 deletions

View File

@ -80,9 +80,9 @@ nl
malloc calloc free memcpy malloc calloc free memcpy
} compile-uncompiled } compile-uncompiled
{ { build-tree } compile-uncompiled
build-tree optimize-tree
} compile-uncompiled { optimize-tree } compile-uncompiled
vocabs [ words compile-uncompiled "." write flush ] each vocabs [ words compile-uncompiled "." write flush ] each

View File

@ -92,7 +92,7 @@ M: node generate-node drop iterate-next ;
%jump-label ; %jump-label ;
: generate-call ( label -- next ) : generate-call ( label -- next )
dup maybe-compile ! dup maybe-compile
end-basic-block end-basic-block
dup compiling-loops get at [ dup compiling-loops get at [
%jump-label f %jump-label f
@ -232,7 +232,7 @@ M: #dispatch generate-node
] if ; ] if ;
M: #call generate-node M: #call generate-node
! dup node-input-infos [ class>> ] map set-operand-classes dup node-input-infos [ class>> ] map set-operand-classes
dup find-if-intrinsic [ dup find-if-intrinsic [
do-if-intrinsic do-if-intrinsic
] [ ] [

View File

@ -20,47 +20,49 @@ M: #phi compute-live-values*
[ [ out-r>> ] [ phi-in-r>> ] bi look-at-phi ] [ [ out-r>> ] [ phi-in-r>> ] bi look-at-phi ]
2bi ; 2bi ;
SYMBOL: if-node
M: #branch remove-dead-code* M: #branch remove-dead-code*
[ [ (remove-dead-code) ] map ] change-children ; [ [ [ (remove-dead-code) ] map ] change-children ]
[ if-node set ]
bi ;
: remove-phi-inputs ( #phi -- ) : remove-phi-inputs ( #phi -- )
dup [ out-d>> ] [ phi-in-d>> flip ] bi filter-corresponding flip >>phi-in-d dup [ out-d>> ] [ phi-in-d>> flip ] bi filter-corresponding flip >>phi-in-d
dup [ out-r>> ] [ phi-in-r>> flip ] bi filter-corresponding flip >>phi-in-r dup [ out-r>> ] [ phi-in-r>> flip ] bi filter-corresponding flip >>phi-in-r
drop ; drop ;
! SYMBOL: if-node : live-value-indices ( values -- indices )
! [ length ] keep live-values get
! : dead-value-indices ( values -- indices ) '[ , nth , key? ] filter ; inline
! [ length ] keep live-values get
! '[ , nth , key? not ] filter ; inline : drop-d-values ( values indices -- node )
! [ drop filter-live ] [ nths ] 2bi
! : drop-d-values ( values indices -- node ) [ make-values ] keep
! [ drop filter-live ] [ nths filter-live ] 2bi [ drop ] [ zip ] 2bi
! [ make-values ] keep #shuffle ;
! [ drop ] [ zip ] 2bi
! #shuffle ; : drop-r-values ( values indices -- nodes ) 2drop f ;
!
! : drop-r-values ( values indices -- nodes )
! [ dup make-values [ #r> ] keep ] dip ! [ dup make-values [ #r> ] keep ] dip
! drop-d-values dup out-d>> dup make-values #>r ! drop-d-values dup out-d>> dup make-values #>r
! 3array ; ! 3array ;
!
! : insert-drops ( nodes d-values r-values d-indices r-indices -- nodes' ) : insert-drops ( nodes d-values r-values d-indices r-indices -- nodes' )
! '[ '[
! [ , drop-d-values 1array ] [ , drop-d-values 1array ]
! [ , drop-r-values ] [ , drop-r-values ]
! bi* 3append bi* 3append
! ] 3map ; ] 3map ;
!
! : hoist-drops ( #phi -- ) : hoist-drops ( #phi -- )
! if-node get swap if-node get swap
! { {
! [ phi-in-d>> ] [ phi-in-d>> ]
! [ phi-in-r>> ] [ phi-in-r>> ]
! [ out-d>> dead-value-indices ] [ out-d>> live-value-indices ]
! [ out-r>> dead-value-indices ] [ out-r>> live-value-indices ]
! } cleave } cleave
! '[ , , , , insert-drops ] change-children drop ; '[ , , , , insert-drops ] change-children drop ;
: remove-phi-outputs ( #phi -- ) : remove-phi-outputs ( #phi -- )
[ filter-live ] change-out-d [ filter-live ] change-out-d
@ -69,7 +71,7 @@ M: #branch remove-dead-code*
M: #phi remove-dead-code* M: #phi remove-dead-code*
{ {
! [ hoist-drops ] [ hoist-drops ]
[ remove-phi-inputs ] [ remove-phi-inputs ]
[ remove-phi-outputs ] [ remove-phi-outputs ]
[ ] [ ]

View File

@ -4,7 +4,8 @@ compiler.tree.combinators compiler.tree.propagation
compiler.tree.cleanup compiler.tree.escape-analysis compiler.tree.cleanup compiler.tree.escape-analysis
compiler.tree.tuple-unboxing compiler.tree.debugger compiler.tree.tuple-unboxing compiler.tree.debugger
compiler.tree.normalization compiler.tree.checker tools.test compiler.tree.normalization compiler.tree.checker tools.test
kernel math stack-checker.state accessors combinators io ; kernel math stack-checker.state accessors combinators io
prettyprint ;
IN: compiler.tree.dead-code.tests IN: compiler.tree.dead-code.tests
\ remove-dead-code must-infer \ remove-dead-code must-infer
@ -96,9 +97,4 @@ IN: compiler.tree.dead-code.tests
[ ] [ [ dup [ 3 throw ] [ ] if ] optimize-quot drop ] unit-test [ ] [ [ dup [ 3 throw ] [ ] if ] optimize-quot drop ] unit-test
: non-flushable-4 ( a -- b ) drop f ; [ [ [ . ] [ drop ] if ] ] [ [ [ dup . ] [ ] if drop ] optimize-quot ] unit-test
: recursive-test-1 ( a b -- )
dup 10 < [
>r drop 5 non-flushable-4 r> 1 + recursive-test-1
] [ 2drop ] if ; inline recursive

View File

@ -6,7 +6,7 @@ compiler.tree.propagation compiler.tree.cleanup
compiler.tree.combinators compiler.tree sequences math math.private compiler.tree.combinators compiler.tree sequences math math.private
kernel tools.test accessors slots.private quotations.private kernel tools.test accessors slots.private quotations.private
prettyprint classes.tuple.private classes classes.tuple prettyprint classes.tuple.private classes classes.tuple
compiler.tree.intrinsics ; compiler.tree.intrinsics namespaces ;
\ escape-analysis must-infer \ escape-analysis must-infer
@ -295,3 +295,13 @@ C: <ro-box> ro-box
[ 1 ] [ [ 1 cons boa 2 cons boa car>> ] count-unboxed-allocations ] unit-test [ 1 ] [ [ 1 cons boa 2 cons boa car>> ] count-unboxed-allocations ] unit-test
[ 0 ] [ [ 1 cons boa 2 cons boa dup . car>> ] count-unboxed-allocations ] unit-test [ 0 ] [ [ 1 cons boa 2 cons boa dup . car>> ] count-unboxed-allocations ] unit-test
[ 0 ] [ [ 1 cons boa "x" get slot ] count-unboxed-allocations ] unit-test
: impeach-node ( quot: ( node -- ) -- )
dup slip impeach-node ; inline recursive
: bleach-node ( quot: ( node -- ) -- )
[ bleach-node ] curry [ ] compose impeach-node ; inline recursive
[ 2 ] [ [ [ ] bleach-node ] count-unboxed-allocations ] unit-test

View File

@ -59,10 +59,10 @@ M: #push escape-analysis*
] [ 2drop f ] if ; ] [ 2drop f ] if ;
: record-slot-call ( #call -- ) : record-slot-call ( #call -- )
[ out-d>> first ] [ slot-offset ] [ in-d>> first ] tri [ out-d>> first ] [ slot-offset ] [ in-d>> first ] tri over
over [ [ [ record-slot-access ] [ copy-slot-value ] 3bi ]
[ record-slot-access ] [ copy-slot-value ] 3bi [ [ unknown-allocation ] [ drop ] [ add-escaping-value ] tri* ]
] [ 2drop unknown-allocation ] if ; if ;
M: #call escape-analysis* M: #call escape-analysis*
dup word>> { dup word>> {
@ -88,3 +88,5 @@ M: #alien-indirect escape-analysis*
[ in-d>> add-escaping-values ] [ in-d>> add-escaping-values ]
[ out-d>> unknown-allocations ] [ out-d>> unknown-allocations ]
bi ; bi ;
M: #alien-callback escape-analysis* drop ;

View File

@ -21,10 +21,10 @@ IN: compiler.tree.optimizer
detect-loops detect-loops
! invert-loops ! invert-loops
! fuse-branches ! fuse-branches
! escape-analysis escape-analysis
! unbox-tuples unbox-tuples
! compute-def-use compute-def-use
! remove-dead-code remove-dead-code
! strength-reduce ! strength-reduce
compute-def-use USE: kernel compute-def-use USE: kernel
dup check-nodes ; dup check-nodes ;

View File

@ -52,7 +52,6 @@ IN: compiler.tree.propagation.recursive
3bi ; 3bi ;
M: #recursive propagate-around ( #recursive -- ) M: #recursive propagate-around ( #recursive -- )
"blah" USE: io print
{ 0 } clone [ USE: math { 0 } clone [ USE: math
dup first 10 = [ "OOPS" throw ] [ dup first 1+ swap set-first ] if dup first 10 = [ "OOPS" throw ] [ dup first 1+ swap set-first ] if
constraints [ clone ] change constraints [ clone ] change

View File

@ -37,3 +37,12 @@ TUPLE: empty-tuple ;
[ [ <=> ] sort ] [ [ <=> ] sort ]
[ [ <=> ] with search ] [ [ <=> ] with search ]
} [ [ ] swap [ test-unboxing ] curry unit-test ] each } [ [ ] swap [ test-unboxing ] curry unit-test ] each
! A more complicated example
: impeach-node ( quot: ( node -- ) -- )
dup slip impeach-node ; inline recursive
: bleach-node ( quot: ( node -- ) -- )
[ bleach-node ] curry [ ] compose impeach-node ; inline recursive
[ ] [ [ [ ] bleach-node ] test-unboxing ] unit-test

View File

@ -58,9 +58,11 @@ M: #push unbox-tuples* ( #push -- nodes )
: unbox-slot-access ( #call -- nodes ) : unbox-slot-access ( #call -- nodes )
dup out-d>> first unboxed-slot-access? [ dup out-d>> first unboxed-slot-access? [
[ in-d>> second 1array #drop ] ! [ in-d>> second 1array #drop ]
[ prepare-slot-access slot-access-shuffle ] ! [
bi 2array prepare-slot-access slot-access-shuffle
! ]
! bi 2array
] when ; ] when ;
M: #call unbox-tuples* M: #call unbox-tuples*
@ -133,4 +135,6 @@ M: #alien-invoke unbox-tuples* dup in-d>> assert-not-unboxed ;
M: #alien-indirect unbox-tuples* dup in-d>> assert-not-unboxed ; M: #alien-indirect unbox-tuples* dup in-d>> assert-not-unboxed ;
M: #alien-callback unbox-tuples* ;
: unbox-tuples ( nodes -- nodes ) [ unbox-tuples* ] map-nodes ; : unbox-tuples ( nodes -- nodes ) [ unbox-tuples* ] map-nodes ;

View File

@ -20,3 +20,6 @@ M: thread error-in-thread ( error thread -- )
error-thread get-global error-in-thread. print-error flush error-thread get-global error-in-thread. print-error flush
] bind ] bind
] if ; ] if ;
[ self error-in-thread stop ]
thread-error-hook set-global

View File

@ -223,9 +223,6 @@ GENERIC: error-in-thread ( error thread -- )
dup register-thread dup register-thread
set-self ; set-self ;
[ self error-in-thread stop ]
thread-error-hook set-global
PRIVATE> PRIVATE>
[ init-threads ] "threads" add-init-hook [ init-threads ] "threads" add-init-hook