38 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2009 Slava Pestov.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: accessors combinators.short-circuit kernel sequences math
 | 
						|
compiler.utilities compiler.cfg compiler.cfg.instructions compiler.cfg.rpo
 | 
						|
compiler.cfg.predecessors compiler.cfg.utilities ;
 | 
						|
IN: compiler.cfg.block-joining
 | 
						|
 | 
						|
! Joining blocks that are not calls and are connected by a single CFG edge.
 | 
						|
! This pass does not update ##phi nodes and should therefore only run
 | 
						|
! before stack analysis.
 | 
						|
: join-block? ( bb -- ? )
 | 
						|
    {
 | 
						|
        [ kill-block? not ]
 | 
						|
        [ predecessors>> length 1 = ]
 | 
						|
        [ predecessor kill-block? not ]
 | 
						|
        [ predecessor successors>> length 1 = ]
 | 
						|
        [ [ predecessor ] keep back-edge? not ]
 | 
						|
    } 1&& ;
 | 
						|
 | 
						|
: join-instructions ( bb pred -- )
 | 
						|
    [ instructions>> ] bi@ dup pop* push-all ;
 | 
						|
 | 
						|
: update-successors ( bb pred -- )
 | 
						|
    [ successors>> ] dip (>>successors) ;
 | 
						|
 | 
						|
: join-block ( bb pred -- )
 | 
						|
    [ join-instructions ] [ update-successors ] 2bi ;
 | 
						|
 | 
						|
: join-blocks ( cfg -- cfg' )
 | 
						|
    needs-predecessors
 | 
						|
 | 
						|
    dup post-order [
 | 
						|
        dup join-block?
 | 
						|
        [ dup predecessor join-block ] [ drop ] if
 | 
						|
    ] each
 | 
						|
 | 
						|
    cfg-changed predecessors-changed ;
 |