Fix another bug in stack-analysis
parent
7ea4e255fb
commit
ccb662c60e
|
@ -100,4 +100,10 @@ IN: compiler.cfg.stack-analysis.tests
|
|||
[ [ ##peek? ] count 1 assert= ]
|
||||
[ [ ##replace? ] count 1 assert= ]
|
||||
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
|
|
@ -3,7 +3,7 @@
|
|||
USING: accessors assocs kernel namespaces math sequences fry grouping
|
||||
sets make combinators compiler.cfg.copy-prop compiler.cfg.def-use
|
||||
compiler.cfg.instructions compiler.cfg.registers compiler.cfg.rpo
|
||||
compiler.cfg.hats ;
|
||||
compiler.cfg.hats compiler.cfg ;
|
||||
IN: compiler.cfg.stack-analysis
|
||||
|
||||
! Convert stack operations to register operations
|
||||
|
@ -95,6 +95,16 @@ UNION: neutral-insn
|
|||
|
||||
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 ;
|
||||
|
||||
M: ##inc-d visit [ , ] [ n>> adjust-d ] bi ;
|
||||
|
@ -181,13 +191,6 @@ SYMBOLS: state-in state-out ;
|
|||
: with-state ( state quot -- )
|
||||
[ 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 ;
|
||||
|
||||
: must-equal ( seq -- elt )
|
||||
|
@ -254,7 +257,7 @@ ERROR: cannot-merge-poisoned states ;
|
|||
[
|
||||
drop
|
||||
dup [ not ] any? [
|
||||
handle-back-edge <state>
|
||||
2drop <state>
|
||||
] [
|
||||
dup [ poisoned?>> ] any? [
|
||||
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
|
||||
! so we wrap the whole thing with a 'make'
|
||||
[
|
||||
dup basic-block set
|
||||
dup block-in-state
|
||||
[ swap set-block-in-state ] [
|
||||
[
|
||||
|
|
Loading…
Reference in New Issue