Fix another bug in stack-analysis
parent
7ea4e255fb
commit
ccb662c60e
|
@ -100,4 +100,10 @@ IN: compiler.cfg.stack-analysis.tests
|
||||||
[ [ ##peek? ] count 1 assert= ]
|
[ [ ##peek? ] count 1 assert= ]
|
||||||
[ [ ##replace? ] count 1 assert= ]
|
[ [ ##replace? ] count 1 assert= ]
|
||||||
tri
|
tri
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
! Sync before a back-edge, not after
|
||||||
|
[ 1 ] [
|
||||||
|
[ 1000 [ ] times ] test-stack-analysis eliminate-dead-code linearize-basic-blocks
|
||||||
|
[ ##add-imm? ] count
|
||||||
] unit-test
|
] unit-test
|
|
@ -3,7 +3,7 @@
|
||||||
USING: accessors assocs kernel namespaces math sequences fry grouping
|
USING: accessors assocs kernel namespaces math sequences fry grouping
|
||||||
sets make combinators compiler.cfg.copy-prop compiler.cfg.def-use
|
sets make combinators compiler.cfg.copy-prop compiler.cfg.def-use
|
||||||
compiler.cfg.instructions compiler.cfg.registers compiler.cfg.rpo
|
compiler.cfg.instructions compiler.cfg.registers compiler.cfg.rpo
|
||||||
compiler.cfg.hats ;
|
compiler.cfg.hats compiler.cfg ;
|
||||||
IN: compiler.cfg.stack-analysis
|
IN: compiler.cfg.stack-analysis
|
||||||
|
|
||||||
! Convert stack operations to register operations
|
! Convert stack operations to register operations
|
||||||
|
@ -95,6 +95,16 @@ UNION: neutral-insn
|
||||||
|
|
||||||
M: neutral-insn visit , ;
|
M: neutral-insn visit , ;
|
||||||
|
|
||||||
|
UNION: sync-if-back-edge
|
||||||
|
##branch
|
||||||
|
##conditional-branch
|
||||||
|
##compare-imm-branch ;
|
||||||
|
|
||||||
|
M: sync-if-back-edge visit
|
||||||
|
basic-block get [ successors>> ] [ number>> ] bi '[ number>> _ < ] any?
|
||||||
|
[ sync-state ] when
|
||||||
|
, ;
|
||||||
|
|
||||||
: adjust-d ( n -- ) state get [ + ] change-d-height drop ;
|
: adjust-d ( n -- ) state get [ + ] change-d-height drop ;
|
||||||
|
|
||||||
M: ##inc-d visit [ , ] [ n>> adjust-d ] bi ;
|
M: ##inc-d visit [ , ] [ n>> adjust-d ] bi ;
|
||||||
|
@ -181,13 +191,6 @@ SYMBOLS: state-in state-out ;
|
||||||
: with-state ( state quot -- )
|
: with-state ( state quot -- )
|
||||||
[ state ] dip with-variable ; inline
|
[ state ] dip with-variable ; inline
|
||||||
|
|
||||||
: handle-back-edge ( bb states -- )
|
|
||||||
[ predecessors>> ] dip [
|
|
||||||
dup [
|
|
||||||
[ [ sync-state ] modify-instructions ] with-state
|
|
||||||
] [ 2drop ] if
|
|
||||||
] 2each ;
|
|
||||||
|
|
||||||
ERROR: must-equal-failed seq ;
|
ERROR: must-equal-failed seq ;
|
||||||
|
|
||||||
: must-equal ( seq -- elt )
|
: must-equal ( seq -- elt )
|
||||||
|
@ -254,7 +257,7 @@ ERROR: cannot-merge-poisoned states ;
|
||||||
[
|
[
|
||||||
drop
|
drop
|
||||||
dup [ not ] any? [
|
dup [ not ] any? [
|
||||||
handle-back-edge <state>
|
2drop <state>
|
||||||
] [
|
] [
|
||||||
dup [ poisoned?>> ] any? [
|
dup [ poisoned?>> ] any? [
|
||||||
cannot-merge-poisoned
|
cannot-merge-poisoned
|
||||||
|
@ -288,6 +291,7 @@ ERROR: cannot-merge-poisoned states ;
|
||||||
! block-in-state may add phi nodes at the start of the basic block
|
! block-in-state may add phi nodes at the start of the basic block
|
||||||
! so we wrap the whole thing with a 'make'
|
! so we wrap the whole thing with a 'make'
|
||||||
[
|
[
|
||||||
|
dup basic-block set
|
||||||
dup block-in-state
|
dup block-in-state
|
||||||
[ swap set-block-in-state ] [
|
[ swap set-block-in-state ] [
|
||||||
[
|
[
|
||||||
|
|
Loading…
Reference in New Issue