1 / 36

Compiler Construction Recap

Compiler Construction Recap. Omer Tripp. Register Allocation (via graph coloring). Taken from . The Register Allocation Problem. Rewrite the intermediate code to use fewer temporaries than there are machine registers Method: assign multiple temporaries to a register

herb
Download Presentation

Compiler Construction Recap

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Compiler ConstructionRecap Omer Tripp

  2. Register Allocation(via graph coloring) Taken from

  3. The Register Allocation Problem • Rewrite the intermediate code to use fewer temporaries than there are machine registers • Method: assign multiple temporaries to a register • But without changing the program behavior

  4. An Example of register allocation • Consider the program a := c + d e := a + b f := e - 1 • with the assumption that a and edie after use • Temporary a can be “reused” after e := a + b • The same: Temporary e can be reused afterf := e - 1 • Can allocate a, e, and f all to one register (r1): r1 := r2 + r3 r1 := r1 + r4 r1 := r1 - 1

  5. Basic Register Allocation Idea • The value of a dead temporary is not needed for the rest of the computation • A dead temporary can be reused • Basic rule: • Temporaries t1 and t2 can share the same register if at any point in the program at most one of t1 or t2 is live !

  6. {b,c,f} a := b + c d := -a e := d + f {a,c,f} {c,d,f} {c,d,e,f} {c,e} b := d + e e := e - 1 {b,c,e,f} f := 2 * e {c,f} {c,f} {b} b := f + c {b} Algorithm to minimize the number of registers: Part I • Compute live variables for each point: {a,b} not included in any subset a b f c e d

  7. The Register Interference Graph • Two temporaries that are live simultaneously cannot be allocated in the same register • We construct an undirected graph • A node for each temporary • An edge between t1 and t2 if they are live simultaneously at some point in the program • This is the register interference graph (RIG) • Two temporaries can be allocated to the same register if there is no edge connecting them

  8. a := b + c d := -a e := d + f b := d + e e := e - 1 f := 2 * e b := f + c Register Interference Graph. Example. • For our example: a b f c e d • E.g., b and ccannot be in the same register • E.g., b and d can be in the same register

  9. Graph Coloring. Definitions. • A coloring of a graph is an assignment of colors to nodes, such that nodes connected by an edge have different colors • A graph is k-colorable if it has a coloring with k colors

  10. Register Allocation Through Graph Coloring • In our problem, colors = registers • We need to assign colors (registers) to graph nodes (temporaries) • Let k = number of machine registers • If the RIG is k-colorable then there is a register assignment that uses no more than k registers

  11. a r2 b r3 r1 f c r4 r2 e r3 d Graph Coloring. Example. • Consider the example RIG • There is no coloring with less than 4 colors • There are 4-colorings of this graph

  12. r2 := r3 + r4 r3 := -r2 r2 := r3 + r1 r3 := r3 + r2 r2 := r2 - 1 r1 := 2 * r2 r3 := r1 + r4 Graph Coloring. Example. • Under this coloring the code becomes:

  13. Computing Graph Colorings • The remaining problem is to compute a coloring for the interference graph • But: • This problem is very hard (NP-hard). No efficient algorithms are known • A coloring might not exist for a given number or registers • The solution to (1) is to use heuristics • We’ll consider the other problem later

  14. Graph Coloring Heuristic • Observation: • Pick a node t with fewer than k neighbors in RIG • Eliminate t and its edges from RIG • If the resulting graph has a k-coloring then so does the original graph • Why? • Let c1,…,cn be the colors assigned to the neighbors of t in the reduced graph • Since n < k, we can pick some color for t that is different from those of its neighbors

  15. Graph Coloring Heuristic • The following works well in practice: • Pick a node t with fewer than k neighbors • Put t on a stack and remove it from the RIG • Repeat until the graph has one node • Then start assigning colors to nodes on the stack (starting with the last node added) • At each step pick a color different from those assigned to already colored neighbors

  16. Graph Coloring Example (1) • Remove a and then d • Start with the RIG and with k = 4: a b f Stack: {} c e d

  17. Graph Coloring Example (2) • Now all nodes have fewer than 4 neighbors and can be removed: c, b, e, f b f Stack: {d, a} c e

  18. a b f c e d Graph Coloring Example (2) • Start assigning colors to: f, e, b, c, d, a r2 r3 r1 r4 r2 r3

  19. a b f c e d What if the Heuristic Fails? • What if during simplification we get to a state where all nodes have k or more neighbors ? • Example: try to find a 3-coloring of the RIG:

  20. b f c e d What if the Heuristic Fails? • Remove a and get stuck (as shown below) • Pick a node as a candidate for spilling • A spilled temporary “lives” in memory • Assume that f is picked as a candidate

  21. What if the Heuristic Fails? • Remove f and continue the simplification • Simplification now succeeds: b, d, e, c b c e d

  22. r3 b f c r1 r2 e r3 d What if the Heuristic Fails? • On the assignment phase we get to the point when we have to assign a color to f • We hope that among the 4 neighbors of f we use less than 3 colors => optimistic coloring ?

  23. Spilling • Since optimistic coloring failed we must spill temporary f • We must allocate a memory location as the home of f • Typically this is in the current stack frame • Call this address fa • Before each operation that uses f, insert f := load fa • After each operation that defines f, insert store f, fa

  24. Spilling. Example. • This is the new code after spilling f a := b + c d := -a f := load fa e := d + f b := d + e e := e - 1 f := 2 * e store f, fa f := load fa b := f + c

  25. {b,c,f} a := b + c d := -a f := load fa e := d + f {a,c,f} {c,d,f} {c,d,e,f} {c,f} {c,d,f} {c,e} b := d + e e := e - 1 f := 2 * e store f, fa {b,c,e,f} {c,f} {c,f} {c,f} f := load fa b := f + c {b} {b} Recomputing Liveness Information • The new liveness information after spilling:

  26. Recomputing Liveness Information • The new liveness information is almost as before • f is live only • Between a f := load fa and the next instruction • Between a store f, fa and the preceding instruction. • Spilling reduces the live range of f • And thus reduces its interferences • Which result in fewer neighbors in RIG for f

  27. Recompute RIG After Spilling • The only changes are in removing some of the edges of the spilled node • In our case f still interferes only with c and d • And the resulting RIG is 3-colorable a b f c e d

  28. Spilling (Cont.) • Additional spills might be required before a coloring is found • The tricky part is deciding what to spill • Possible heuristics: • Spill temporaries with most conflicts • Spill temporaries with few definitions and uses • Avoid spilling in inner loops • Any heuristic is correct

  29. Graph Coloring • Given K registers, show an interference graph with K+1 nodes (i.e.temp variables) where there is actual spill • Given 2 registers, show an interference graph with K+1 (i.e. temp variables) where there is no spill

  30. Exam Questions

  31. מועד ב', 2011-12 שאלה 3 (15 נקודות) עבור מכונה עם k רגיסטרים. א. (9 נק') נתון גרף תלויות עם k צמתים כך שכל צומת תלוי בכל הצמתים האחרים (כלומר, הגרף הוא קליק ולכל צומת יש k-1 שכנים). במהלך ריצת האלגוריתם להקצאת רגיסטרים, כמה פעמים יתבצע potential spill? כמה פעמים יתבצע actual spill? נמקי.ב. (9 נק') נתון גרף תלויות עם k+1 צמתים כך שכל צומת תלוי בכל הצמתים האחרים (כלומר, הגרף הוא קליק ולכל צומת יש k שכנים).במהלך ריצת האלגוריתם להקצאת רגיסטרים, כמה פעמים יתבצע potential spill? כמה פעמים יתבצע actual spill? נמקי.

  32. מועד א', 2011-12 • שאלה 1 (25 נקודות) • נתונה רשימת מאורעות. לכל אחד מהמאורעות צייני בקצרה (מספיקות 1-3 שורות הסבר לכל פריט): • האם הוא מתרחש בזמן ריצה, בזמן קומפילציה, או בזמן בניית הקומפיילר; • אם בחרת בזמן קומפילציה, מהו השלב המסוים בקומפיילר בו מתרחש המאורע; • מהם מבני הנתונים והאלגוריתמים הרלבנטיים. • במידה ויש מספר תשובות נכונות, הסבירי את כולן. • א. (5 נק') ערך ה callee-save register משוחזר מהמחסנית. • ב. (5 נק') יש בדקדוק רקורסיה שמאלית ולכן הוא לא LL(1). • ג. (5 נק') מתגלה בתוכנית IC הערה שמתחילה ב /* ללא סוגר /* תואם. • ד. (5 נק') מתגלה השגיאה: יש שתי פונקציות בקבצים שונים של שפת C, יש להן אותו שם ואותם פרמטרים אבל הן מחזירות טיפוס שונה. • ה. (5 נק') אובייקט x משוחרר מייד כאשר הוא הופך ללא נגיש מה root set.

  33. מועד א', 2011-12 מימוש הפקודות setjmp (set jump) ו longjmp (long jump) מעורר קשיים על ניהול הרגיסטרים. הסבירי כיצד מימושן ישפיע, אם בכלל, על ניהול ה callee save resigters. התייחסי לשני סוגים של סכמות של קומפיילרים: סכמה שבה כל פרוצדורה שומרת את כל ה callee-save registers. סכמה שבה כל פרוצדורה שומרת רק את ה callee-save registers שהיא עושה בהם שימוש. setjmp longjmp

  34. מועד א', 2011-12 • נתונה הפונקציה הבאה (בשפת IC): • boolean foo(int a, int b, int c) { • boolean x = (a==(b==c)); • return x; • } • א. (7 נק') האם היא חוקית (בשפת IC)? אם היא אינה חוקית, הסבירי אילו חוקי טיפוסים מופרים (כתבי במפורש חוקים אלו). • ב. (7 נק') נניח שהטיפוס של a,b,c היה boolean (במקום int). האם התשובה תהייה שונה? אם יש הבדל, הסבירי אותו.

More Related