compiler.cfg.stacks.local: replace-sets values must be hash-sets (#1507)
The compiler hang was because { D: 3 D: 2 } was unequal to { D: 2 D: 3 }, so using a set should fix that.locals-and-roots
parent
41d9bda3ce
commit
707bc801a4
|
@ -50,7 +50,7 @@ HELP: replace-loc
|
||||||
{ $see-also replaces } ;
|
{ $see-also replaces } ;
|
||||||
|
|
||||||
HELP: replace-sets
|
HELP: replace-sets
|
||||||
{ $var-description "An " { $link assoc } " that maps from basic blocks to stack locations." } ;
|
{ $var-description "An " { $link assoc } " in which each key is a " { $link basic-block } " and each value a " { $link hash-set } " with locations that were replaced in that block." } ;
|
||||||
|
|
||||||
HELP: replaces
|
HELP: replaces
|
||||||
{ $var-description "An " { $link assoc } " that maps from stack locations to virtual registers that were put on the stack." }
|
{ $var-description "An " { $link assoc } " that maps from stack locations to virtual registers that were put on the stack." }
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
USING: accessors assocs biassocs combinators compiler.cfg
|
USING: assocs compiler.cfg.instructions compiler.cfg.registers
|
||||||
compiler.cfg.instructions compiler.cfg.registers compiler.cfg.stacks
|
compiler.cfg.stacks.height compiler.cfg.stacks.local
|
||||||
compiler.cfg.stacks.height compiler.cfg.stacks.local compiler.cfg.utilities
|
compiler.cfg.utilities compiler.test cpu.architecture kernel
|
||||||
compiler.test cpu.architecture make namespaces kernel tools.test ;
|
kernel.private make math namespaces sequences.private slots.private
|
||||||
|
tools.test ;
|
||||||
QUALIFIED: sets
|
QUALIFIED: sets
|
||||||
IN: compiler.cfg.stacks.local.tests
|
IN: compiler.cfg.stacks.local.tests
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ IN: compiler.cfg.stacks.local.tests
|
||||||
! end-local-analysis
|
! end-local-analysis
|
||||||
{
|
{
|
||||||
HS{ }
|
HS{ }
|
||||||
{ }
|
HS{ }
|
||||||
HS{ }
|
HS{ }
|
||||||
} [
|
} [
|
||||||
V{ } 137 insns>block
|
V{ } 137 insns>block
|
||||||
|
@ -39,7 +40,7 @@ IN: compiler.cfg.stacks.local.tests
|
||||||
] cfg-unit-test
|
] cfg-unit-test
|
||||||
|
|
||||||
{
|
{
|
||||||
{ D: 3 }
|
HS{ D: 3 }
|
||||||
} [
|
} [
|
||||||
V{ } 137 insns>block
|
V{ } 137 insns>block
|
||||||
[ 0 0 rot record-stack-heights ]
|
[ 0 0 rot record-stack-heights ]
|
||||||
|
@ -115,3 +116,43 @@ IN: compiler.cfg.stacks.local.tests
|
||||||
{ H{ { D: -1 40 } } } [
|
{ H{ { D: -1 40 } } } [
|
||||||
D: 1 inc-stack 40 D: 0 replace-loc replaces get
|
D: 1 inc-stack 40 D: 0 replace-loc replaces get
|
||||||
] cfg-unit-test
|
] cfg-unit-test
|
||||||
|
|
||||||
|
! Compiling these words used to make the compiler hang due to a bug in
|
||||||
|
! end-local-analysis. So the test is just to compile them and if it
|
||||||
|
! doesn't hang, the bug is fixed! See #1507
|
||||||
|
: my-new-key4 ( a i j -- i/j )
|
||||||
|
2over
|
||||||
|
slot
|
||||||
|
swap over
|
||||||
|
! a i el j el
|
||||||
|
[
|
||||||
|
! a i el j
|
||||||
|
swap
|
||||||
|
! a i j el
|
||||||
|
77 eq?
|
||||||
|
[
|
||||||
|
rot drop and
|
||||||
|
]
|
||||||
|
[
|
||||||
|
! a i j
|
||||||
|
over or my-new-key4
|
||||||
|
] if
|
||||||
|
]
|
||||||
|
[
|
||||||
|
! a i el j
|
||||||
|
2drop t
|
||||||
|
! a i t
|
||||||
|
my-new-key4
|
||||||
|
] if ; inline recursive
|
||||||
|
|
||||||
|
: badword ( y -- )
|
||||||
|
0 swap dup
|
||||||
|
{ integer object } declare
|
||||||
|
[
|
||||||
|
{ array-capacity object } declare nip
|
||||||
|
1234 1234 pick
|
||||||
|
f
|
||||||
|
my-new-key4
|
||||||
|
set-slot
|
||||||
|
]
|
||||||
|
curry (each-integer) ;
|
||||||
|
|
|
@ -85,7 +85,7 @@ SYMBOLS: local-peek-set replaces ;
|
||||||
[
|
[
|
||||||
replaces get remove-redundant-replaces
|
replaces get remove-redundant-replaces
|
||||||
[ height-state get emit-changes ]
|
[ height-state get emit-changes ]
|
||||||
[ keys swap replace-sets get set-at ] bi
|
[ keys >hash-set swap replace-sets get set-at ] bi
|
||||||
]
|
]
|
||||||
[ [ local-peek-set get ] dip peek-sets get set-at ]
|
[ [ local-peek-set get ] dip peek-sets get set-at ]
|
||||||
[ [ compute-local-kill-set ] keep kill-sets get set-at ] tri ;
|
[ [ compute-local-kill-set ] keep kill-sets get set-at ] tri ;
|
||||||
|
|
Loading…
Reference in New Issue