} cleave ;
:: assign-registers-in-block ( bb -- )
+ bb begin-block
bb [
[
- bb begin-block
[
{
[ insn#>> 1 - prepare-insn ]
[ , ]
} cleave
] each
- bb compute-live-out
] V{ } make
- ] change-instructions drop ;
+ ] change-instructions drop
+ bb compute-live-out ;
-: assign-registers ( live-intervals cfg -- )
- [ init-assignment ] dip
+: assign-registers ( cfg live-intervals -- )
+ init-assignment
linearization-order [ kill-block?>> not ] filter
[ assign-registers-in-block ] each ;
HELP: admissible-registers
{ $values { "cfg" cfg } { "regs" assoc } }
{ $description "Lists all registers usable by the cfg by register class. In general, that's all registers except the frame pointer register that might be used by the cfg for other purposes." } ;
+
+ARTICLE: "compiler.cfg.linear-scan" "Linear-scan register allocation"
+"Linear scan to assign physical registers. SSA liveness must have been computed already."
+$nl
+"References:"
+{ $list
+ "Linear Scan Register Allocation by Massimiliano Poletto and Vivek Sarkar http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf"
+ "Linear Scan Register Allocation for the Java HotSpot Client Compiler by Christian Wimmer and http://www.ssw.uni-linz.ac.at/Research/Papers/Wimmer04Master/"
+ "Quality and Speed in Linear-scan Register Allocation by Omri Traub, Glenn Holloway, Michael D. Smith http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.8435"
+} ;
+
+
+ABOUT: "compiler.cfg.linear-scan"
compiler.cfg.linear-scan.assignment
compiler.cfg.linear-scan.live-intervals
compiler.cfg.linear-scan.numbering
-compiler.cfg.linear-scan.resolve cpu.architecture kernel locals
-sequences ;
+compiler.cfg.linear-scan.resolve compiler.cfg.utilities cpu.architecture
+kernel sequences ;
IN: compiler.cfg.linear-scan
-! References:
-
-! Linear Scan Register Allocation
-! by Massimiliano Poletto and Vivek Sarkar
-! http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf
-
-! Linear Scan Register Allocation for the Java HotSpot Client Compiler
-! by Christian Wimmer
-! and http://www.ssw.uni-linz.ac.at/Research/Papers/Wimmer04Master/
-
-! Quality and Speed in Linear-scan Register Allocation
-! by Omri Traub, Glenn Holloway, Michael D. Smith
-! http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.8435
-
-! SSA liveness must have been computed already
-
-:: (linear-scan) ( cfg machine-registers -- )
- cfg number-instructions
- cfg compute-live-intervals machine-registers allocate-registers
- cfg assign-registers
- cfg resolve-data-flow
- cfg check-numbering ;
-
: admissible-registers ( cfg -- regs )
machine-registers swap frame-pointer?>> [
[ [ frame-reg = not ] filter ] assoc-map
] when ;
+: allocate-and-assign-registers ( cfg -- )
+ [ ] [ compute-live-intervals ] [ admissible-registers ] tri
+ allocate-registers assign-registers ;
+
: linear-scan ( cfg -- )
- dup admissible-registers (linear-scan) ;
+ {
+ number-instructions
+ allocate-and-assign-registers
+ resolve-data-flow
+ check-numbering
+ } apply-passes ;