231 lines
5.1 KiB
Factor
231 lines
5.1 KiB
Factor
USING: accessors arrays assocs compiler.cfg compiler.cfg.dependence
|
|
compiler.cfg.test-words compiler.cfg.instructions
|
|
compiler.cfg.linearization compiler.cfg.registers compiler.cfg.scheduling
|
|
compiler.cfg.utilities grouping kernel math namespaces tools.test random
|
|
sequences sets splitting vectors words compiler.cfg.test-words ;
|
|
IN: compiler.cfg.scheduling.tests
|
|
|
|
! Test split-insns
|
|
{
|
|
{
|
|
V{ }
|
|
V{ }
|
|
V{ T{ ##test-branch } }
|
|
}
|
|
} [ V{ T{ ##test-branch } } split-insns ] unit-test
|
|
|
|
{
|
|
{
|
|
V{ T{ ##inc-d } T{ ##inc-r } T{ ##callback-inputs } }
|
|
V{ T{ ##add } T{ ##sub } T{ ##mul } }
|
|
V{ T{ ##test-branch } }
|
|
}
|
|
} [
|
|
V{
|
|
T{ ##inc-d }
|
|
T{ ##inc-r }
|
|
T{ ##callback-inputs }
|
|
T{ ##add }
|
|
T{ ##sub }
|
|
T{ ##mul }
|
|
T{ ##test-branch }
|
|
} split-insns
|
|
] unit-test
|
|
|
|
[
|
|
{
|
|
V{ }
|
|
V{ T{ ##add } T{ ##sub } T{ ##mul } }
|
|
V{ T{ ##dispatch } }
|
|
}
|
|
] [
|
|
V{
|
|
T{ ##add }
|
|
T{ ##sub }
|
|
T{ ##mul }
|
|
T{ ##dispatch }
|
|
} split-insns
|
|
] unit-test
|
|
|
|
! Instructions gets numbered as a side-effect
|
|
{ t } [
|
|
V{
|
|
T{ ##inc-r }
|
|
T{ ##inc-d }
|
|
T{ ##load-tagged }
|
|
T{ ##allot }
|
|
T{ ##set-slot-imm }
|
|
} insns>cfg dup schedule-instructions cfg>insns [ insn#>> ] all?
|
|
] unit-test
|
|
|
|
: test-1187 ( -- insns )
|
|
V{
|
|
##inc-r
|
|
##inc-d
|
|
##peek
|
|
##peek
|
|
##load-tagged
|
|
##allot
|
|
##set-slot-imm
|
|
##load-reference
|
|
##allot
|
|
##set-slot-imm
|
|
##set-slot-imm
|
|
##set-slot-imm
|
|
##replace-imm
|
|
##replace
|
|
##replace
|
|
##replace
|
|
##replace
|
|
##replace-imm
|
|
##replace
|
|
##branch
|
|
} [ [ new ] [ 2 * ] bi* >>insn# ] map-index ;
|
|
|
|
{
|
|
{
|
|
{ T{ ##inc-r } T{ ##inc-d } T{ ##peek } T{ ##peek } }
|
|
{
|
|
T{ ##load-tagged }
|
|
T{ ##allot }
|
|
T{ ##set-slot-imm }
|
|
T{ ##load-reference }
|
|
T{ ##allot }
|
|
T{ ##set-slot-imm }
|
|
T{ ##set-slot-imm }
|
|
T{ ##set-slot-imm }
|
|
T{ ##replace-imm }
|
|
T{ ##replace }
|
|
T{ ##replace }
|
|
T{ ##replace }
|
|
T{ ##replace }
|
|
T{ ##replace-imm }
|
|
T{ ##replace }
|
|
}
|
|
{ T{ ##branch } }
|
|
}
|
|
} [ test-1187 [ f >>insn# ] map split-insns ] unit-test
|
|
|
|
{
|
|
V{
|
|
T{ ##load-tagged { insn# 0 } }
|
|
T{ ##load-reference { insn# 6 } }
|
|
T{ ##set-slot-imm { insn# 14 } }
|
|
T{ ##replace { insn# 16 } }
|
|
}
|
|
} [
|
|
test-not-in-order setup-nodes [ ready? ] filter [ insn>> ] map
|
|
] unit-test
|
|
|
|
{
|
|
V{
|
|
T{ ##allot { insn# 2 } }
|
|
T{ ##set-slot-imm { insn# 4 } }
|
|
T{ ##allot { insn# 8 } }
|
|
T{ ##set-slot-imm { insn# 10 } }
|
|
T{ ##load-tagged { insn# 0 } }
|
|
T{ ##load-reference { insn# 6 } }
|
|
T{ ##set-slot-imm { insn# 12 } }
|
|
T{ ##set-slot-imm { insn# 14 } }
|
|
T{ ##replace { insn# 16 } }
|
|
}
|
|
} [ test-not-in-order reorder-body ] unit-test
|
|
|
|
{ t f } [
|
|
node new ready?
|
|
node new { { 1 2 } } >>precedes ready?
|
|
] unit-test
|
|
|
|
{ t } [
|
|
100 [
|
|
test-not-in-order setup-nodes [ insn>> ] map
|
|
] replicate all-equal?
|
|
] unit-test
|
|
|
|
{ t } [
|
|
100 [
|
|
test-not-in-order setup-nodes [ score ] map
|
|
] replicate all-equal?
|
|
] unit-test
|
|
|
|
! You should get the exact same instruction order each time.
|
|
{ t } [
|
|
100 [ test-not-in-order reorder-body ] replicate all-equal?
|
|
] unit-test
|
|
|
|
{ t } [
|
|
100 [ test-1187 split-insns 1 swap nth reorder ] replicate all-equal?
|
|
] unit-test
|
|
|
|
: insns-1 ( -- insns )
|
|
V{
|
|
T{ ##peek { dst 275 } { loc D 2 } }
|
|
T{ ##load-tagged { dst 277 } { val 0 } }
|
|
T{ ##allot
|
|
{ dst 280 }
|
|
{ size 16 }
|
|
{ class-of array }
|
|
{ temp 6 }
|
|
}
|
|
T{ ##set-slot-imm
|
|
{ src 277 }
|
|
{ obj 280 }
|
|
{ slot 1 }
|
|
{ tag 2 }
|
|
}
|
|
T{ ##load-reference
|
|
{ dst 283 }
|
|
{ obj
|
|
{
|
|
vector
|
|
2
|
|
1
|
|
tuple
|
|
258304024774
|
|
vector
|
|
8390923745423
|
|
}
|
|
}
|
|
}
|
|
T{ ##allot
|
|
{ dst 285 }
|
|
{ size 32 }
|
|
{ class-of tuple }
|
|
{ temp 12 }
|
|
}
|
|
T{ ##set-slot-imm
|
|
{ src 283 }
|
|
{ obj 285 }
|
|
{ slot 1 }
|
|
{ tag 7 }
|
|
}
|
|
T{ ##set-slot-imm
|
|
{ src 280 }
|
|
{ obj 285 }
|
|
{ slot 2 }
|
|
{ tag 7 }
|
|
}
|
|
} [ 2 * >>insn# ] map-index ;
|
|
|
|
{ t f } [
|
|
insns-1 setup-nodes
|
|
! Anyone preceding insn# 14?
|
|
[
|
|
[ precedes>> keys [ insn>> insn#>> ] map 14 swap member? ] any?
|
|
]
|
|
[
|
|
unclip-last over swap remove-node
|
|
[ precedes>> keys [ insn>> insn#>> ] map 14 swap member? ] any?
|
|
] bi
|
|
] unit-test
|
|
|
|
{ V{ 0 6 12 14 } } [
|
|
insns-1 setup-nodes
|
|
[ parent-index>> -1/0. = ] filter [ insn>> insn#>> ] map
|
|
] unit-test
|
|
|
|
{ 7 } [
|
|
test-not-in-order setup-nodes
|
|
[ parent-index>> -1/0. = ] count
|
|
] unit-test
|