compiler.cfg.ssa.cssa, compiler.cfg.ssa.destruction, compiler.utilities: docs & tests
							parent
							
								
									16f6025979
								
							
						
					
					
						commit
						63a1e90af8
					
				| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
USING: compiler.cfg.representations help.markup help.syntax ;
 | 
			
		||||
IN: compiler.cfg.ssa.cssa
 | 
			
		||||
 | 
			
		||||
ARTICLE: "compiler.cfg.ssa.cssa" "Conventional SSA Form"
 | 
			
		||||
"Convert SSA to conventional SSA. This pass runs after representation selection (see " { $link select-representations } "), so it must keep track of representations when introducing new values." ;
 | 
			
		||||
 | 
			
		||||
ABOUT: "compiler.cfg.ssa.cssa"
 | 
			
		||||
| 
						 | 
				
			
			@ -7,10 +7,6 @@ namespaces sequences ;
 | 
			
		|||
FROM: assocs => change-at ;
 | 
			
		||||
IN: compiler.cfg.ssa.cssa
 | 
			
		||||
 | 
			
		||||
! Convert SSA to conventional SSA. This pass runs after representation
 | 
			
		||||
! selection, so it must keep track of representations when introducing
 | 
			
		||||
! new values.
 | 
			
		||||
 | 
			
		||||
SYMBOLS: edge-copies phi-copies ;
 | 
			
		||||
 | 
			
		||||
: init-copies ( bb -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
USING: compiler.cfg.instructions help.markup help.syntax ;
 | 
			
		||||
IN: compiler.cfg.ssa.destruction
 | 
			
		||||
 | 
			
		||||
ARTICLE: "compiler.cfg.ssa.destruction" "SSA Destruction"
 | 
			
		||||
"Because of the design of the register allocator, this pass has three peculiar properties."
 | 
			
		||||
{ $list
 | 
			
		||||
  "Instead of renaming vreg usages in the CFG, a map from vregs to canonical representatives is computed. This allows the register allocator to use the original SSA names to get reaching definitions."
 | 
			
		||||
  { "Useless " { $link ##copy } " instructions, and all " { $link ##phi } " instructions, are eliminated, so the register allocator does not have to remove any redundant operations." }
 | 
			
		||||
  { "This pass computes live sets and fills out the " { $slot "gc-roots" } " slots of GC maps with " { $vocab-link "compiler.cfg.liveness" } ", so the linear scan register allocator does not need to compute liveness again." }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
ABOUT: "compiler.cfg.ssa.destruction"
 | 
			
		||||
| 
						 | 
				
			
			@ -11,20 +11,6 @@ kernel locals make namespaces sequences sets ;
 | 
			
		|||
FROM: namespaces => set ;
 | 
			
		||||
IN: compiler.cfg.ssa.destruction
 | 
			
		||||
 | 
			
		||||
! Because of the design of the register allocator, this pass
 | 
			
		||||
! has three peculiar properties.
 | 
			
		||||
!
 | 
			
		||||
! 1) Instead of renaming vreg usages in the CFG, a map from
 | 
			
		||||
! vregs to canonical representatives is computed. This allows
 | 
			
		||||
! the register allocator to use the original SSA names to get
 | 
			
		||||
! reaching definitions.
 | 
			
		||||
! 2) Useless ##copy instructions, and all ##phi instructions,
 | 
			
		||||
! are eliminated, so the register allocator does not have to
 | 
			
		||||
! remove any redundant operations.
 | 
			
		||||
! 3) This pass computes live sets and fills out GC maps with
 | 
			
		||||
! compiler.cfg.liveness, so the linear scan register allocator
 | 
			
		||||
! does not need to compute liveness again.
 | 
			
		||||
 | 
			
		||||
! Maps leaders to equivalence class elements.
 | 
			
		||||
SYMBOL: class-element-map
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
USING: assocs compiler.cfg.ssa.destruction.leaders help.markup help.syntax math
 | 
			
		||||
sequences ;
 | 
			
		||||
IN: compiler.utilities
 | 
			
		||||
 | 
			
		||||
HELP: compress-path
 | 
			
		||||
{ $values { "source" integer } { "assoc" assoc } { "destination" integer } }
 | 
			
		||||
{ $description "Gets the original definer for a vreg number. Then inserts a direct path from 'source' to that definer. For example if the assoc is " { $code "{ { 1 2 } { 2 3 } { 3 4 } { 4 4 } }" } "then the original definer of 1 is 4. The word is used by " { $link leader } " to figure out what the top leader of a vreg is." } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
USING: compiler.utilities kernel tools.test ;
 | 
			
		||||
IN: compiler.utilities.tests
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
    9
 | 
			
		||||
    H{ { 9 9 } { 44 9 } { 7 9 } }
 | 
			
		||||
} [
 | 
			
		||||
    7 H{ { 7 44 } { 44 9 } { 9 9 } } [ compress-path ] keep
 | 
			
		||||
] unit-test
 | 
			
		||||
		Loading…
	
		Reference in New Issue