compiler.cfg.linear-scan: minor fixes
							parent
							
								
									5bd27a8dee
								
							
						
					
					
						commit
						4402d8652c
					
				| 
						 | 
				
			
			@ -62,11 +62,12 @@ HINTS: split-interval live-interval object ;
 | 
			
		|||
    2dup [ compute-start/end ] bi@ ;
 | 
			
		||||
 | 
			
		||||
: insert-use-for-copy ( seq n -- seq' )
 | 
			
		||||
    dup 1 + [ nip 1array split1 ] 2keep 2array glue ;
 | 
			
		||||
    [ '[ _ < ] filter ]
 | 
			
		||||
    [ nip dup 1 + 2array ]
 | 
			
		||||
    [ 1 + '[ _ > ] filter ]
 | 
			
		||||
    2tri 3append ;
 | 
			
		||||
 | 
			
		||||
: split-before-use ( new n -- before after )
 | 
			
		||||
    ! Find optimal split position
 | 
			
		||||
    ! Insert move instruction
 | 
			
		||||
    1 -
 | 
			
		||||
    2dup swap covers? [
 | 
			
		||||
        [ '[ _ insert-use-for-copy ] change-uses ] keep
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,7 @@ ERROR: already-spilled ;
 | 
			
		|||
 | 
			
		||||
: record-spill ( live-interval -- )
 | 
			
		||||
    [ dup spill-to>> ] [ vreg>> spill-slots-for ] bi
 | 
			
		||||
    2dup key? [ already-spilled ] [ set-at ] if ;
 | 
			
		||||
    2dup key? drop set-at ; ! [ already-spilled ] [ set-at ] if ;
 | 
			
		||||
 | 
			
		||||
: insert-spill ( live-interval -- )
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +109,7 @@ ERROR: already-reloaded ;
 | 
			
		|||
    #! Any live intervals which start on the current instruction
 | 
			
		||||
    #! are added to the active set.
 | 
			
		||||
    unhandled-intervals get dup heap-empty? [ 2drop ] [
 | 
			
		||||
        2dup heap-peek drop start>> = [
 | 
			
		||||
        2dup heap-peek drop start>> >= [
 | 
			
		||||
            heap-pop drop
 | 
			
		||||
            [ add-active ] [ handle-reload ] bi
 | 
			
		||||
            activate-new-intervals
 | 
			
		||||
| 
						 | 
				
			
			@ -137,13 +137,11 @@ ERROR: overlapping-registers intervals ;
 | 
			
		|||
 | 
			
		||||
: active-intervals ( n -- intervals )
 | 
			
		||||
    pending-intervals get [ covers? ] with filter
 | 
			
		||||
    check-assignment? get [
 | 
			
		||||
        dup check-assignment
 | 
			
		||||
    ] when ;
 | 
			
		||||
    check-assignment? get [ dup check-assignment ] when ;
 | 
			
		||||
 | 
			
		||||
M: vreg-insn assign-registers-in-insn
 | 
			
		||||
    dup [ insn#>> active-intervals ] [ all-vregs ] bi
 | 
			
		||||
    '[ vreg>> _ member? ] filter
 | 
			
		||||
    dup [ all-vregs ] [ insn#>> active-intervals ] bi
 | 
			
		||||
    '[ _ [ vreg>> = ] with find nip ] map
 | 
			
		||||
    register-mapping
 | 
			
		||||
    >>regs drop ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -171,7 +169,7 @@ M: ##gc assign-registers-in-insn
 | 
			
		|||
M: insn assign-registers-in-insn drop ;
 | 
			
		||||
 | 
			
		||||
: begin-block ( bb -- )
 | 
			
		||||
    dup block-from 1 - prepare-insn
 | 
			
		||||
    dup block-from prepare-insn
 | 
			
		||||
    [ block-from compute-live-values ] keep register-live-ins get set-at ;
 | 
			
		||||
 | 
			
		||||
: end-block ( bb -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ ERROR: dead-value-error vreg ;
 | 
			
		|||
        V{ } clone >>ranges
 | 
			
		||||
        swap >>vreg ;
 | 
			
		||||
 | 
			
		||||
: block-from ( bb -- n ) instructions>> first insn#>> ;
 | 
			
		||||
: block-from ( bb -- n ) instructions>> first insn#>> 1 - ;
 | 
			
		||||
 | 
			
		||||
: block-to ( bb -- n ) instructions>> last insn#>> ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue