register allocation
play

Register Allocation Based on slides by E. Ernst Register Allocation - PowerPoint PPT Presentation

Compilation 2016 Register Allocation Based on slides by E. Ernst Register Allocation Recall: Interference graph Node: temporary Edge: interference (cannot unify end points) Undirected Unification of temporaries:


  1. 
 
 Compilation 2016 Register Allocation Based on slides by E. Ernst

  2. Register Allocation � Recall: Interference graph • Node: temporary • Edge: interference (cannot unify end points) • Undirected � Unification of temporaries: graph coloring • Neighbors ⇒ different colors • K -coloring of interference graph = register allocation • If no K -coloring exists: spill and repeat � Basic parameter: We have K registers � Useful concept: Significant degree : degree( n ) ≥ K � Convenient words for it: A heavy node (vs light ) Register allocation 2

  3. Graph Coloring � The basic problem is NP-complete (polynomial to verify, exponential to compute) � We are lucky: Good approximation linear! � Algorithm: • build interference graph G • simplify G • spill some nodes • select colors Register allocation 3

  4. Graph Coloring: Build � Build the interference graph � Recall how: • build data flow graph • compute use/def locally, then live-in/live-out via iteration • create interference graph node per temp, edge per pair of temps with overlapping live ranges Register allocation 4

  5. Graph Coloring: Simplify � Reducing the graph G, preserving colorability � Algorithm: • repeat { find light node n; remove n from G; push n } � For each step we have: Graph K -colorable after removal ⇒ also K -colorable before removal � Reason: Node n is light, i.e., at most K -1 colors used � Stopping: Every node is heavy Register allocation 5

  6. Graph Coloring: Spill � Remove one node from the graph G, marking it as a ‘potential spill’ � Algorithm: • find heavy node n; remove n; mark n ‘spill’; push n � Got here because Simplify stopped • If G non-empty: all nodes heavy, proceed, go to Simplify • If G empty: go to Select Register allocation 6

  7. Graph Coloring: Select � Pop and re-insert all nodes from the stack � Algorithm: • repeat { n=pop; add n with edges to G; color n } � Cases • n was light: reinsert/color always works • n was heavy (marked ‘spill’): go ahead and try! ;-) • it worked — continue • it failed — insert w/o color, continue, noting failure � Stopping: stack empty Register allocation 7

  8. Graph Coloring: Start over � Perform spills, if any � Algorithm: • rewrite program: add load/store of temp at use/def, using new, short-lived temporaries � Changed program ⇒ recompute all (go to build) � Note: entire algorithm typically repeats only 1-2 times Register allocation 8

  9. Graph Coloring Example � Example program, similar to 3- live-in : k j g := mem[j+12] address assembly h := k - 1 f := g * h � K = 4 e := mem[j+8] m := mem[j+16] � Build interference graph b := mem[f] c := e + 8 d := c f k := m + 4 j := b live-out : d k j e j k b m d h c g Register allocation 9

  10. Graph Coloring Example � Simplify: live-in : k j g := mem[j+12] • g, h, c, f are light , less than K h := k - 1 f := g * h neighbors e := mem[j+8] • choose g, h, then k for removal m := mem[j+16] b := mem[f] c := e + 8 d := c f k := m + 4 j := b live-out : d k j e j k b m d h c g Register allocation 10

  11. Graph Coloring Example � Simplify: live-in : k j g := mem[j+12] • g, h, c, f are light , less than K h := k - 1 f := g * h neighbors e := mem[j+8] • choose g, h, then k for removal m := mem[j+16] b := mem[f] c := e + 8 d := c f k := m + 4 j := b live-out : d k j e j k b m d h c Register allocation 11

  12. Graph Coloring Example � Simplify: live-in : k j g := mem[j+12] • g, h, c, f are light , less than K h := k - 1 f := g * h neighbors e := mem[j+8] • choose g, h, then k for removal m := mem[j+16] b := mem[f] c := e + 8 d := c f k := m + 4 j := b live-out : d k j e j k b m d c Register allocation 12

  13. Graph Coloring Example � Simplify: live-in : k j g := mem[j+12] • result after removal of g, h, k h := k - 1 f := g * h • then continue to produce stack e := mem[j+8] m := mem[j+16] • run Select for coloring b := mem[f] • (no Spill) c := e + 8 d := c f k := m + 4 j := b live-out : d k j e At end: j b m STACK: d m c b f e j d k h g c COLORING: 1 3 2 2 4 3 4 1 2 4 Register allocation 13

  14. Graph Coloring Example � Note important property: live-in : k j g := mem[j+12] • choice required during Select h := k - 1 f := g * h • NP-completeness: it’s hard! e := mem[j+8] m := mem[j+16] b := mem[f] c := e + 8 d := c f k := m + 4 j := b live-out : d k j e At end: j k b m STACK: d m c b f e j d k h g h c COLORING: g 1 3 2 2 4 3 4 1 2 4 Register allocation 14

  15. Coalescing � Basic idea: If two nodes do not interfere, they could be the same color (register) f � Problem: Merging two nodes 
 e can add a heavy node 
 j k b m from two light ones d h c g � Problem: Making a heavy node 
 heavier could prevent it becoming light 
 enough during Simplify Register allocation 15

  16. Coalescing Criteria � Solution: Criterion that ensures 
 K -colorability preservation f e � Briggs: ensure merged node 
 k j b m has < K heavy neighbors d h c � George: ensure first node to 
 f merge has only light exclusive 
 e neighbors (i.e., not neighbors 
 2 j k of second node to merge) b m 1 d h c Register allocation 16

  17. Briggs Correctness � Briggs: ensure merged node 
 f has < K heavy neighbors e j k b m d � Let G K -colorable, j,b have K’<K heavy 
 c h neighbors, G’ is G with merged node jb. Then G' is K - colorable � Proof: Assume C K -coloring of G, simplify G' to remove all light neighbors of j and b in G, then remove jb (ok: K’ neighbors now). Transfer colors from C to the remaining G’. Reinsert jb with the color of j ; reinsert the remaining nodes --- they are all light: removed by Simplify; they can have color from C because their neighbors have at most the same colors (color of b may be gone). Register allocation 17

  18. George Correctness � George: ensure first node to merge 
 f e has only light exclusive neighbors 
 2 (i.e., not neighbors of second 
 j k b m 1 d node to merge) c h � Let G K -colorable, j,b merging, all exclusive neighbors 
 of j light. Let G’ be G with merged node jb. T hen G' is K-colorable � Proof: Assume C K -coloring of G. Simplify G' removing all light neighbors of j , then transfer all colors of C to other nodes than jb ; color jb with the color of b (now, all neighbors of jb are neighbors of b in G, so that color is OK for jb ); then reinsert and color all the missing neighbors of j (they are all light: immediately colorable) Register allocation 18

  19. Graph Coloring with Coalescing � Extend previous algorithm with build extra phases simplify � Simplify modified coalesce � Core addition: coalesce freeze � Needed: freeze, to give up may spill select did spill Register allocation 19

  20. Graph Coloring with Coalescing � Build: as before, but mark end- build points of move edges as move related (‘moving’) simplify � Simplify: remove light nodes if not coalesce move related freeze � Coalesce : enforce Briggs or may spill George criterion; repeat until all nodes heavy or moving select did spill Register allocation 20

  21. Graph Coloring with Coalescing � Freeze: unmark one low degree build moving node, enabling new simplifications simplify � Spill: preferring low degree node, coalesce select and push freeze � Select: pop all, assign colors for may spill each reinsertion select did spill Register allocation 21

  22. Graph Coloring with Coalescing � Do spill: change program as before build � When actual spill occurred, rebuild simplify graph coalesce freeze � Extra corner case: constrained move , where pair has both move may spill and interference (remove ‘moving’ mark) select did spill Register allocation 22

  23. Spilling — déjà vu � When rerunning build, we can preserve coalescing nodes created before first spill was discovered � Stack frame can grow wildly due to spilled temps � May well have disjoint live ranges: Use graph coloring with coalescing! � NB: no limit on stack frame size, as if K = ∞ , just coalesce aggressively (no criteria) Register allocation 23

  24. Summary � Register allocation builds on interference graph � Idea: colored nodes represent choice of registers � Graph coloring NP-complete, but linear approx. � Algorithm: build simplify spill select start_over � Coalescing: merge two non-interfering nodes � Problem: creates ‘heavier’ nodes � Solution: criteria (Briggs, George) � Enhanced algorithm: build simplify coalesce freeze may_spill select did_spill � Can use aggressive coalescing on the stack Register allocation 24

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend