2008-09-15 02:54:48 -04:00
USING: tools.test random sorting sequences sets hashtables assocs
2009-06-11 18:55:14 -04:00
kernel fry arrays splitting namespaces math accessors vectors locals
2009-08-07 18:44:50 -04:00
math.order grouping strings strings.private classes layouts
2008-10-09 00:42:53 -04:00
cpu.architecture
2009-05-29 14:11:34 -04:00
compiler.cfg
compiler.cfg.optimizer
2008-10-09 00:42:53 -04:00
compiler.cfg.instructions
2008-09-15 02:54:48 -04:00
compiler.cfg.registers
2009-06-11 18:55:14 -04:00
compiler.cfg.predecessors
compiler.cfg.rpo
2009-06-21 01:20:01 -04:00
compiler.cfg.debugger
2009-08-08 05:02:18 -04:00
compiler.cfg.def-use
2009-07-14 13:06:55 -04:00
compiler.cfg.comparisons
2012-12-31 13:30:17 -05:00
compiler.cfg.ssa.destruction.leaders
2008-09-17 01:46:38 -04:00
compiler.cfg.linear-scan
2008-10-19 02:10:21 -04:00
compiler.cfg.linear-scan.allocation
2009-06-11 18:55:14 -04:00
compiler.cfg.linear-scan.allocation.state
compiler.cfg.linear-scan.allocation.splitting
compiler.cfg.linear-scan.allocation.spilling
2015-09-13 12:02:01 -04:00
compiler.cfg.linear-scan.live-intervals
compiler.cfg.linear-scan.numbering
compiler.cfg.linear-scan.ranges
2014-11-07 13:02:14 -05:00
compiler.cfg.linear-scan.debugger
compiler.cfg.utilities ;
2010-02-26 17:17:40 -05:00
IN: compiler.cfg.linear-scan.tests
2008-09-15 02:54:48 -04:00
2009-06-11 18:55:14 -04:00
check-allocation? on
2009-07-07 14:01:27 -04:00
check-numbering? on
2009-06-11 18:55:14 -04:00
2010-07-16 19:57:45 -04:00
! Live interval calculation
! A value is defined and never used; make sure it has the right
! live range
V{
T{ ##load-integer f 1 0 }
2015-08-13 18:23:10 -04:00
T{ ##replace-imm f D: 0 "hi" }
2010-07-16 19:57:45 -04:00
T{ ##branch }
} 0 test-bb
: test-live-intervals ( -- )
2014-11-07 13:02:14 -05:00
0 get block>cfg
2010-07-16 19:57:45 -04:00
[ cfg set ] [ number-instructions ] [ compute-live-intervals ] tri
2015-06-14 02:53:00 -04:00
drop ;
2010-07-16 19:57:45 -04:00
2015-07-03 12:39:59 -04:00
{ } [
2010-07-16 19:57:45 -04:00
H{
{ 1 int-rep }
} representations set
H{
{ 1 1 }
} leader-map set
test-live-intervals
] unit-test
2015-07-03 12:39:59 -04:00
{ 0 0 } [
2010-07-16 19:57:45 -04:00
1 live-intervals get at [ start>> ] [ end>> ] bi
] unit-test
2015-09-13 22:43:58 -04:00
! Live interval splitting
2009-06-04 19:53:02 -04:00
2010-05-22 01:25:10 -04:00
cfg new 0 >>spill-area-size 4 >>spill-area-align cfg set
2009-07-30 03:13:30 -04:00
H{ } spill-slots set
2009-08-08 05:02:18 -04:00
H{
2009-09-03 21:58:56 -04:00
{ 1 float-rep }
{ 2 float-rep }
{ 3 float-rep }
2009-08-08 05:02:18 -04:00
} representations set
2010-05-14 17:55:00 -04:00
: clean-up-split ( a b -- a b )
[ dup [ [ >vector ] change-uses [ >vector ] change-ranges ] when ] bi@ ;
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
2009-07-10 04:58:51 -04:00
{ end 2 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
2009-07-10 04:58:51 -04:00
{ ranges V{ T{ live-range f 0 2 } } }
2009-09-27 20:28:20 -04:00
{ spill-to T{ spill-slot f 0 } }
2010-05-07 18:22:35 -04:00
{ spill-rep float-rep }
2008-10-19 02:10:21 -04:00
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 5 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 5 f float-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 5 5 } } }
2009-09-27 20:28:20 -04:00
{ reload-from T{ spill-slot f 0 } }
2010-05-07 18:22:35 -04:00
{ reload-rep float-rep }
2008-10-19 02:10:21 -04:00
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 5 } } }
2009-07-30 03:13:30 -04:00
} 2 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
2009-06-11 18:55:14 -04:00
] unit-test
2015-07-03 12:39:59 -04:00
{
2010-05-07 18:22:35 -04:00
f
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-11 18:55:14 -04:00
{ start 1 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
2009-06-11 18:55:14 -04:00
{ ranges V{ T{ live-range f 1 5 } } }
2009-09-27 20:28:20 -04:00
{ reload-from T{ spill-slot f 4 } }
2010-05-07 18:22:35 -04:00
{ reload-rep float-rep }
2009-06-11 18:55:14 -04:00
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-11 18:55:14 -04:00
{ start 0 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
2009-06-11 18:55:14 -04:00
{ ranges V{ T{ live-range f 0 5 } } }
2009-07-30 03:13:30 -04:00
} 0 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
2008-10-19 02:10:21 -04:00
] unit-test
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 3 }
2009-07-01 18:41:07 -04:00
{ start 0 }
2010-05-11 19:11:31 -04:00
{ end 2 }
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
{ ranges V{ T{ live-range f 0 2 } } }
{ spill-to T{ spill-slot f 8 } }
{ spill-rep float-rep }
}
f
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 3 }
{ start 0 }
{ end 5 }
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
{ ranges V{ T{ live-range f 0 5 } } }
} 5 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
2010-05-11 19:11:31 -04:00
] unit-test
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 4 }
{ start 0 }
2009-07-10 04:58:51 -04:00
{ end 1 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 float-rep f } } }
2009-07-10 04:58:51 -04:00
{ ranges V{ T{ live-range f 0 1 } } }
2010-05-11 19:11:31 -04:00
{ spill-to T{ spill-slot f 12 } }
2010-05-07 18:22:35 -04:00
{ spill-rep float-rep }
2009-07-01 18:41:07 -04:00
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 4 }
2009-07-01 18:41:07 -04:00
{ start 20 }
{ end 30 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
2009-07-01 18:41:07 -04:00
{ ranges V{ T{ live-range f 20 30 } } }
2010-05-11 19:11:31 -04:00
{ reload-from T{ spill-slot f 12 } }
2010-05-07 18:22:35 -04:00
{ reload-rep float-rep }
2009-07-01 18:41:07 -04:00
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 4 }
2009-07-01 18:41:07 -04:00
{ start 0 }
{ end 30 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
{ ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
} 10 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
2010-05-07 18:22:35 -04:00
] unit-test
! Don't insert reload if first usage is a def
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 5 }
2010-05-07 18:22:35 -04:00
{ start 0 }
{ end 1 }
{ uses V{ T{ vreg-use f 0 float-rep f } } }
{ ranges V{ T{ live-range f 0 1 } } }
2010-05-11 19:11:31 -04:00
{ spill-to T{ spill-slot f 16 } }
2010-05-07 18:22:35 -04:00
{ spill-rep float-rep }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 5 }
2010-05-07 18:22:35 -04:00
{ start 20 }
{ end 30 }
{ uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
{ ranges V{ T{ live-range f 20 30 } } }
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 5 }
2010-05-07 18:22:35 -04:00
{ start 0 }
{ end 30 }
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
2009-07-01 18:41:07 -04:00
{ ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
2009-07-30 03:13:30 -04:00
} 10 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
2009-07-05 22:32:23 -04:00
] unit-test
2010-05-07 18:22:35 -04:00
! Multiple representations
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 6 }
2010-05-07 18:22:35 -04:00
{ start 0 }
{ end 11 }
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
{ ranges V{ T{ live-range f 0 11 } } }
2010-05-11 19:11:31 -04:00
{ spill-to T{ spill-slot f 24 } }
2010-05-07 18:22:35 -04:00
{ spill-rep double-rep }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 6 }
2010-05-07 18:22:35 -04:00
{ start 20 }
{ end 20 }
{ uses V{ T{ vreg-use f 20 f double-rep } } }
{ ranges V{ T{ live-range f 20 20 } } }
2010-05-11 19:11:31 -04:00
{ reload-from T{ spill-slot f 24 } }
2010-05-07 18:22:35 -04:00
{ reload-rep double-rep }
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-11 19:11:31 -04:00
{ vreg 6 }
2010-05-07 18:22:35 -04:00
{ start 0 }
{ end 20 }
{ uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } T{ vreg-use f 20 f double-rep } } }
{ ranges V{ T{ live-range f 0 20 } } }
} 15 split-for-spill
2010-05-14 17:55:00 -04:00
clean-up-split
] unit-test
2015-07-03 12:39:59 -04:00
{
2010-05-14 17:55:00 -04:00
f
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-14 17:55:00 -04:00
{ vreg 7 }
{ start 8 }
{ end 8 }
{ ranges V{ T{ live-range f 8 8 } } }
{ uses V{ T{ vreg-use f 8 int-rep } } }
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-14 17:55:00 -04:00
{ vreg 7 }
{ start 4 }
{ end 8 }
{ ranges V{ T{ live-range f 4 8 } } }
{ uses V{ T{ vreg-use f 8 int-rep } } }
} 4 split-for-spill
clean-up-split
] unit-test
! trim-before-ranges, trim-after-ranges
2015-07-03 12:39:59 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-14 17:55:00 -04:00
{ vreg 8 }
{ start 0 }
{ end 3 }
{ ranges V{ T{ live-range f 0 3 } } }
{ uses V{ T{ vreg-use f 0 f int-rep } T{ vreg-use f 2 f int-rep } } }
{ spill-to T{ spill-slot f 32 } }
{ spill-rep int-rep }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-14 17:55:00 -04:00
{ vreg 8 }
{ start 14 }
{ end 16 }
{ ranges V{ T{ live-range f 14 16 } } }
{ uses V{ T{ vreg-use f 14 f int-rep } } }
{ reload-from T{ spill-slot f 32 } }
{ reload-rep int-rep }
}
2015-07-03 12:39:59 -04:00
} [
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-05-14 17:55:00 -04:00
{ vreg 8 }
{ start 0 }
{ end 16 }
{ ranges V{ T{ live-range f 0 4 } T{ live-range f 6 10 } T{ live-range f 12 16 } } }
2015-09-14 12:49:18 -04:00
{ uses
V{
T{ vreg-use f 0 f int-rep }
T{ vreg-use f 2 f int-rep }
T{ vreg-use f 14 f int-rep } }
}
2010-05-14 17:55:00 -04:00
} 8 split-for-spill
clean-up-split
2010-05-07 18:22:35 -04:00
] unit-test
2009-08-08 05:02:18 -04:00
H{
{ 1 int-rep }
{ 2 int-rep }
{ 3 int-rep }
} representations set
2015-07-03 12:39:59 -04:00
{
2009-07-07 04:28:55 -04:00
{
3
10
2008-10-19 02:10:21 -04:00
}
2015-07-03 12:39:59 -04:00
} [
2009-07-07 04:28:55 -04:00
H{
{ int-regs
V{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-07-07 04:28:55 -04:00
{ reg 1 }
{ start 1 }
{ end 15 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 1 int-rep f } T{ vreg-use f 3 f int-rep } T{ vreg-use f 7 f int-rep } T{ vreg-use f 10 f int-rep } T{ vreg-use f 15 f int-rep } } }
2009-07-07 04:28:55 -04:00
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-07-07 04:28:55 -04:00
{ reg 2 }
{ start 3 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 4 f int-rep } T{ vreg-use f 8 f int-rep } } }
2009-07-07 04:28:55 -04:00
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 3 }
2009-07-07 04:28:55 -04:00
{ reg 3 }
{ start 3 }
{ end 10 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
2009-07-07 04:28:55 -04:00
}
}
2008-10-19 02:10:21 -04:00
}
2009-07-07 04:28:55 -04:00
} active-intervals set
H{ } inactive-intervals set
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2008-10-19 02:10:21 -04:00
{ start 5 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 5 int-rep f } } }
2008-10-19 02:10:21 -04:00
}
2009-07-07 04:28:55 -04:00
spill-status
2008-10-19 02:10:21 -04:00
] unit-test
2015-07-03 12:39:59 -04:00
{
2009-07-07 04:28:55 -04:00
{
1
1/0.
2008-10-19 02:10:21 -04:00
}
2015-07-03 12:39:59 -04:00
} [
2009-07-07 04:28:55 -04:00
H{
{ int-regs
V{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-07-07 04:28:55 -04:00
{ reg 1 }
{ start 1 }
{ end 15 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 1 int-rep f } } }
2009-07-07 04:28:55 -04:00
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-07-07 04:28:55 -04:00
{ reg 2 }
{ start 3 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
2009-07-07 04:28:55 -04:00
}
}
}
} active-intervals set
H{ } inactive-intervals set
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 3 }
2008-10-19 02:10:21 -04:00
{ start 5 }
{ end 5 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 5 int-rep f } } }
2008-10-19 02:10:21 -04:00
}
2009-07-07 04:28:55 -04:00
spill-status
2008-10-19 02:10:21 -04:00
] unit-test
2009-08-08 05:02:18 -04:00
H{ { 1 int-rep } { 2 int-rep } } representations set
2015-07-03 12:39:59 -04:00
{ } [
2008-09-15 02:54:48 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 100 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 100 } } }
}
2008-09-15 02:54:48 -04:00
}
2008-10-19 02:10:21 -04:00
H{ { int-regs { "A" } } }
2008-09-15 02:54:48 -04:00
check-linear-scan
] unit-test
2015-07-03 12:39:59 -04:00
{ } [
2008-09-15 02:54:48 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 10 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 10 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-04 19:53:02 -04:00
{ start 11 }
{ end 20 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 11 20 } } }
}
2008-09-15 02:54:48 -04:00
}
2008-10-19 02:10:21 -04:00
H{ { int-regs { "A" } } }
2008-09-15 02:54:48 -04:00
check-linear-scan
] unit-test
2015-07-03 12:39:59 -04:00
{ } [
2008-09-15 02:54:48 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 100 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 100 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-04 19:53:02 -04:00
{ start 30 }
{ end 60 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 30 60 } } }
}
2008-09-15 02:54:48 -04:00
}
2008-10-19 02:10:21 -04:00
H{ { int-regs { "A" } } }
2008-09-15 02:54:48 -04:00
check-linear-scan
] unit-test
2015-07-03 12:39:59 -04:00
{ } [
2008-09-15 02:54:48 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 100 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 100 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-04 19:53:02 -04:00
{ start 30 }
{ end 200 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 200 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 30 200 } } }
}
2008-09-15 02:54:48 -04:00
}
2008-10-19 02:10:21 -04:00
H{ { int-regs { "A" } } }
2008-09-15 02:54:48 -04:00
check-linear-scan
] unit-test
[
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-04 19:53:02 -04:00
{ start 0 }
{ end 100 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 0 100 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-04 19:53:02 -04:00
{ start 30 }
{ end 100 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 100 f int-rep } } }
2009-06-04 19:53:02 -04:00
{ ranges V{ T{ live-range f 30 100 } } }
}
2008-09-15 02:54:48 -04:00
}
2008-10-19 02:10:21 -04:00
H{ { int-regs { "A" } } }
2008-09-15 02:54:48 -04:00
check-linear-scan
] must-fail
2009-07-30 03:13:30 -04:00
! Problem with spilling intervals with no more usages after the spill location
2009-08-08 05:02:18 -04:00
H{
{ 1 int-rep }
{ 2 int-rep }
{ 3 int-rep }
{ 4 int-rep }
{ 5 int-rep }
} representations set
2009-07-30 03:13:30 -04:00
2015-07-03 12:39:59 -04:00
{ } [
2009-07-30 03:13:30 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-07-30 03:13:30 -04:00
{ start 0 }
{ end 20 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } T{ vreg-use f 20 f int-rep } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-07-30 03:13:30 -04:00
{ start 0 }
{ end 20 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } T{ vreg-use f 20 f int-rep } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 3 }
2009-07-30 03:13:30 -04:00
{ start 4 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 6 int-rep f } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 4 8 } } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 4 }
2009-07-30 03:13:30 -04:00
{ start 4 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 8 int-rep f } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 4 8 } } }
}
! This guy will invoke the 'spill partially available' code path
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 5 }
2009-07-30 03:13:30 -04:00
{ start 4 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 8 int-rep f } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 4 8 } } }
}
}
H{ { int-regs { "A" "B" } } }
check-linear-scan
] unit-test
! Test spill-new code path
2015-07-03 12:39:59 -04:00
{ } [
2009-07-30 03:13:30 -04:00
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-07-30 03:13:30 -04:00
{ start 0 }
{ end 10 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 6 f int-rep } T{ vreg-use f 10 f int-rep } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 0 10 } } }
}
! This guy will invoke the 'spill new' code path
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 5 }
2009-07-30 03:13:30 -04:00
{ start 2 }
{ end 8 }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 8 int-rep f } } }
2009-07-30 03:13:30 -04:00
{ ranges V{ T{ live-range f 2 8 } } }
}
}
H{ { int-regs { "A" } } }
check-linear-scan
] unit-test
2009-07-01 18:41:07 -04:00
! register-status had problems because it used map>assoc where the sequence
2009-06-30 17:07:58 -04:00
! had multiple keys
2009-08-08 05:02:18 -04:00
H{
{ 1 int-rep }
{ 2 int-rep }
{ 3 int-rep }
{ 4 int-rep }
} representations set
2015-07-03 12:39:59 -04:00
{ { 0 10 } } [
2009-06-30 17:07:58 -04:00
H{
{ int-regs
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 1 }
2009-06-30 17:07:58 -04:00
{ start 0 }
{ end 20 }
{ reg 0 }
{ ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
{ uses V{ 0 2 10 20 } }
}
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 2 }
2009-06-30 17:07:58 -04:00
{ start 4 }
{ end 40 }
{ reg 0 }
{ ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
{ uses V{ 4 6 30 40 } }
}
}
}
} inactive-intervals set
H{
{ int-regs
{
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2009-08-08 05:02:18 -04:00
{ vreg 3 }
2009-06-30 17:07:58 -04:00
{ start 0 }
{ end 40 }
{ reg 1 }
{ ranges V{ T{ live-range f 0 40 } } }
{ uses V{ 0 40 } }
}
}
}
} active-intervals set
2013-03-24 04:09:37 -04:00
T{ live-interval-state
2010-04-28 03:35:46 -04:00
{ vreg 4 }
2009-06-30 17:07:58 -04:00
{ start 8 }
{ end 10 }
{ ranges V{ T{ live-range f 8 10 } } }
2010-05-07 18:22:35 -04:00
{ uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }
2009-06-30 17:07:58 -04:00
}
2015-04-20 15:22:09 -04:00
H{ { int-regs { 0 1 } } } register-status
2009-06-30 17:07:58 -04:00
] unit-test
2014-10-14 07:41:14 -04:00
{ t } [
T{ cfg { frame-pointer? f } } admissible-registers machine-registers =
] unit-test
{ f } [
T{ cfg { frame-pointer? t } } admissible-registers
int-regs of frame-reg swap member?
] unit-test