compiler.cfg.ssa.destruction: refactors maybe/must-eliminate-copy into

one try-eliminate-copy
db4
Björn Lindqvist 2015-06-14 02:13:31 +02:00
parent 98ae0eb02e
commit be342e8638
2 changed files with 27 additions and 33 deletions

View File

@ -1,27 +1,31 @@
USING: compiler.cfg compiler.cfg.instructions USING: compiler.cfg compiler.cfg.instructions
compiler.cfg.ssa.destruction.private help.markup help.syntax ; compiler.cfg.ssa.destruction.private compiler.cfg.ssa.interference help.markup
help.syntax kernel ;
IN: compiler.cfg.ssa.destruction IN: compiler.cfg.ssa.destruction
HELP: class-element-map HELP: class-element-map
{ $var-description "Maps leaders to equivalence class elements." } ; { $var-description "Maps leaders to equivalence class elements which are sequences of " { $link vreg-info } " instances." } ;
HELP: cleanup-cfg HELP: cleanup-cfg
{ $values { "cfg" cfg } } { $values { "cfg" cfg } }
{ $description "In this step, " { $link ##parallel-copy } " instructions are substituted with more concreete " { $link ##copy } " instructions. " { $link ##phi } " instructions are removed here." } ; { $description "In this step, " { $link ##parallel-copy } " instructions are substituted with more concreete " { $link ##copy } " instructions. " { $link ##phi } " instructions are removed here." } ;
HELP: coalesce-elements
{ $values { "merged" "??" } { "follower" "vreg" } { "leader" "vreg" } }
{ $description "Delete follower's class, and set leaders's class to merged." } ;
HELP: coalesce-vregs
{ $values { "merged" "??" } { "follower" "vreg" } { "leader" "vreg" } }
{ $description "Sets 'leader' as the leader of 'follower'." } ;
HELP: copies HELP: copies
{ $var-description "Sequence of copies (tuples of { vreg-dst vreg-src}) that maybe can be eliminated later." } { $var-description "Sequence of copies (tuples of { vreg-dst vreg-src}) that maybe can be eliminated later." }
{ $see-also init-coalescing } ; { $see-also init-coalescing } ;
HELP: maybe-eliminate-copy HELP: try-eliminate-copy
{ $values { "vreg1" "vreg" } { "vreg2" "vreg" } } { $values { "follower" "vreg" } { "leader" "vreg" } { "must?" boolean } }
{ $description "Eliminate a copy if possible." } { $description "Tries to eliminate a vreg copy from 'leader' to 'follower'. If 'must?' is " { $link t } " then a " { $link vregs-shouldn't-interfere } " error is thrown if the vregs interfere." }
{ $see-also must-eliminate-copy } ; { $see-also vregs-interfere? } ;
HELP: must-eliminate-copy
{ $values { "vreg1" "vreg" } { "vreg2" "vreg" } }
{ $description "Eliminates a copy." }
{ $see-also maybe-eliminate-copy } ;
ARTICLE: "compiler.cfg.ssa.destruction" "SSA Destruction" ARTICLE: "compiler.cfg.ssa.destruction" "SSA Destruction"
"Because of the design of the register allocator, this pass has three peculiar properties." "Because of the design of the register allocator, this pass has three peculiar properties."

View File

@ -7,7 +7,7 @@ compiler.cfg.registers compiler.cfg.rpo compiler.cfg.ssa.cssa
compiler.cfg.ssa.destruction.leaders compiler.cfg.ssa.destruction.leaders
compiler.cfg.ssa.interference compiler.cfg.ssa.interference
compiler.cfg.ssa.interference.live-ranges compiler.cfg.utilities compiler.cfg.ssa.interference.live-ranges compiler.cfg.utilities
cpu.architecture kernel locals make namespaces sequences sets ; cpu.architecture kernel make namespaces sequences sets ;
FROM: namespaces => set ; FROM: namespaces => set ;
IN: compiler.cfg.ssa.destruction IN: compiler.cfg.ssa.destruction
@ -15,7 +15,6 @@ SYMBOL: class-element-map
<PRIVATE <PRIVATE
! Sequence of vreg pairs
SYMBOL: copies SYMBOL: copies
: value-of ( vreg -- value ) : value-of ( vreg -- value )
@ -30,11 +29,10 @@ SYMBOL: copies
] bi ] bi
V{ } clone copies set ; V{ } clone copies set ;
: coalesce-elements ( merged vreg1 vreg2 -- ) : coalesce-elements ( merged follower leader -- )
! delete leader1's class, and set leader2's class to merged.
class-element-map get [ delete-at ] [ set-at ] bi-curry bi* ; class-element-map get [ delete-at ] [ set-at ] bi-curry bi* ;
: coalesce-vregs ( merged leader1 leader2 -- ) : coalesce-vregs ( merged follower leader -- )
2dup swap leader-map get set-at coalesce-elements ; 2dup swap leader-map get set-at coalesce-elements ;
GENERIC: prepare-insn ( insn -- ) GENERIC: prepare-insn ( insn -- )
@ -68,32 +66,24 @@ M: ##parallel-copy prepare-insn
ERROR: vregs-shouldn't-interfere vreg1 vreg2 ; ERROR: vregs-shouldn't-interfere vreg1 vreg2 ;
:: must-eliminate-copy ( vreg1 vreg2 -- ) : try-eliminate-copy ( follower leader must? -- )
vreg1 vreg2 = [ -rot leaders 2dup = [ 3drop ] [
vreg1 vreg2 vregs-interfere? 2dup vregs-interfere? [
[ vreg1 vreg2 vregs-shouldn't-interfere ] drop rot [ vregs-shouldn't-interfere ] [ 2drop ] if
[ vreg1 vreg2 coalesce-vregs ] ] [ -rot coalesce-vregs drop ] if
if ] if ;
] unless ;
M: ##tagged>integer prepare-insn M: ##tagged>integer prepare-insn
[ dst>> ] [ src>> ] bi leaders must-eliminate-copy ; [ dst>> ] [ src>> ] bi t try-eliminate-copy ;
M: ##phi prepare-insn M: ##phi prepare-insn
[ dst>> ] [ inputs>> values ] bi [ dst>> ] [ inputs>> values ] bi [ t try-eliminate-copy ] with each ;
[ leaders must-eliminate-copy ] with each ;
: prepare-coalescing ( cfg -- ) : prepare-coalescing ( cfg -- )
init-coalescing [ [ prepare-insn ] each ] simple-analysis ; init-coalescing [ [ prepare-insn ] each ] simple-analysis ;
:: maybe-eliminate-copy ( vreg1 vreg2 -- )
vreg1 vreg2 = [
vreg1 vreg2 vregs-interfere?
[ drop ] [ vreg1 vreg2 coalesce-vregs ] if
] unless ;
: process-copies ( copies -- ) : process-copies ( copies -- )
[ leaders maybe-eliminate-copy ] assoc-each ; [ f try-eliminate-copy ] assoc-each ;
: perform-coalescing ( cfg -- ) : perform-coalescing ( cfg -- )
prepare-coalescing copies get process-copies ; prepare-coalescing copies get process-copies ;