| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  | USING: accessors compiler.cfg compiler.cfg.linear-scan.allocation | 
					
						
							|  |  |  | compiler.cfg.linear-scan.allocation.state | 
					
						
							| 
									
										
										
										
											2015-09-13 12:02:01 -04:00
										 |  |  | compiler.cfg.linear-scan.live-intervals compiler.cfg.linear-scan.ranges | 
					
						
							| 
									
										
										
										
											2015-09-14 12:49:18 -04:00
										 |  |  | compiler.cfg.registers cpu.architecture cpu.x86.assembler.operands heaps kernel | 
					
						
							|  |  |  | namespaces system tools.test ;
 | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  | IN: compiler.cfg.linear-scan.allocation.tests | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  | : interval-[30,46] ( -- live-interval )
 | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |     T{ live-interval-state | 
					
						
							|  |  |  |        { vreg 49 } | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |        { ranges V{ { 30 46 } } } | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |        { uses | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |          V{ | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |              T{ vreg-use { n 30 } { def-rep double-rep } } | 
					
						
							|  |  |  |              T{ vreg-use { n 46 } { use-rep double-rep } } | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |     } clone ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  | : interval-[30,60] ( -- live-interval )
 | 
					
						
							|  |  |  |     T{ live-interval-state | 
					
						
							|  |  |  |        { vreg 25 } | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |        { ranges V{ { 30 60 } } } | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |        { reg RAX } | 
					
						
							|  |  |  |     } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  | cpu x86.64? [ | 
					
						
							|  |  |  |     ! assign-registers | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |     { RAX } [ | 
					
						
							| 
									
										
										
										
											2015-09-14 12:49:18 -04:00
										 |  |  |         H{ { 49 int-rep } } representations set
 | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |         f machine-registers init-allocator | 
					
						
							|  |  |  |         interval-[30,46] dup machine-registers assign-register reg>> | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |     ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! register-status | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |     { { RAX 1/0. } } [ | 
					
						
							|  |  |  |         f machine-registers init-allocator | 
					
						
							|  |  |  |         interval-[30,46] machine-registers register-status | 
					
						
							|  |  |  |     ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-16 11:49:29 -04:00
										 |  |  |     { { RBX 1/0. } } [ | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |         f machine-registers init-allocator | 
					
						
							| 
									
										
										
										
											2015-09-14 12:49:18 -04:00
										 |  |  |         H{ { 25 int-rep } { 49 int-rep } } representations set
 | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |         interval-[30,60] add-active | 
					
						
							|  |  |  |         interval-[30,46] machine-registers register-status | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |     ] unit-test | 
					
						
							| 
									
										
										
										
											2015-06-16 09:25:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ! free-positions | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             { RAX 1/0. } | 
					
						
							| 
									
										
										
										
											2015-06-16 11:49:29 -04:00
										 |  |  |             { RBX 1/0. } | 
					
						
							| 
									
										
										
										
											2015-06-16 09:25:26 -04:00
										 |  |  |             { RCX 1/0. } | 
					
						
							|  |  |  |             { RDX 1/0. } | 
					
						
							|  |  |  |             { RBP 1/0. } | 
					
						
							|  |  |  |             { RSI 1/0. } | 
					
						
							|  |  |  |             { RDI 1/0. } | 
					
						
							|  |  |  |             { R8 1/0. } | 
					
						
							|  |  |  |             { R9 1/0. } | 
					
						
							|  |  |  |             { R10 1/0. } | 
					
						
							|  |  |  |             { R11 1/0. } | 
					
						
							|  |  |  |             { R12 1/0. } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } [ | 
					
						
							|  |  |  |         machine-registers int-regs free-positions | 
					
						
							|  |  |  |     ] unit-test | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  | ] when
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! handle-sync-point | 
					
						
							|  |  |  | { } [ | 
					
						
							|  |  |  |     T{ sync-point { n 30 } } { } handle-sync-point | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : test-active-intervals ( -- assoc )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { int-regs V{ | 
					
						
							|  |  |  |             T{ live-interval-state | 
					
						
							|  |  |  |                { vreg 1 } | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |                { ranges V{ { 30 40 } } } | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |                { uses | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |                  V{ T{ vreg-use { n 32 } { def-rep double-rep } } } | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |                } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             T{ live-interval-state | 
					
						
							|  |  |  |                { vreg 50 } | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |                { ranges V{ { 5 10 } } } | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |                { uses | 
					
						
							| 
									
										
										
										
											2016-04-01 18:23:49 -04:00
										 |  |  |                  V{ T{ vreg-use { n 8 } { def-rep double-rep } } } | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  |                } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } } | 
					
						
							|  |  |  |         { float-regs V{ } } | 
					
						
							|  |  |  |     } ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Why are they both spilled? | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { { int-regs V{ } } { float-regs V{ } } } | 
					
						
							|  |  |  | } [ | 
					
						
							|  |  |  |     f f <basic-block> <cfg> cfg set
 | 
					
						
							|  |  |  |     H{ } clone spill-slots set
 | 
					
						
							|  |  |  |     V{ } clone handled-intervals set
 | 
					
						
							|  |  |  |     100 progress set
 | 
					
						
							|  |  |  |     T{ sync-point { n 35 } } test-active-intervals | 
					
						
							|  |  |  |     [ handle-sync-point ] keep
 | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! spill-at-sync-point | 
					
						
							|  |  |  | { f } [ | 
					
						
							|  |  |  |     <min-heap> unhandled-min-heap set
 | 
					
						
							|  |  |  |     f f <basic-block> <cfg> cfg set
 | 
					
						
							|  |  |  |     40 progress set
 | 
					
						
							| 
									
										
										
										
											2015-06-16 09:02:58 -04:00
										 |  |  |     T{ sync-point { n 40 } } interval-[30,46] spill-at-sync-point | 
					
						
							| 
									
										
										
										
											2015-04-20 15:22:09 -04:00
										 |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! spill-at-sync-point? | 
					
						
							|  |  |  | { t } [ | 
					
						
							|  |  |  |     T{ sync-point { n 15 } } f spill-at-sync-point? | 
					
						
							|  |  |  | ] unit-test |