Register Allocation Harry Xu CS 142 (b) 02/11/2013.

Slides:



Advertisements
Similar presentations
Register Allocation COS 320 David Walker (with thanks to Andrew Myers for many of these slides)
Advertisements

Register Allocation Consists of two parts: Goal : minimize spills
SSA and CPS CS153: Compilers Greg Morrisett. Monadic Form vs CFGs Consider CFG available exp. analysis: statement gen's kill's x:=v 1 p v 2 x:=v 1 p v.
Course Outline Traditional Static Program Analysis –Theory Compiler Optimizations; Control Flow Graphs Data-flow Analysis – today’s class –Classic analyses.
Register Usage Keep as many values in registers as possible Register assignment Register allocation Popular techniques – Local vs. global – Graph coloring.
Register allocation Morgensen, Torben. "Register Allocation." Basics of Compiler Design. pp from (
Register Allocation CS 320 David Walker (with thanks to Andrew Myers for most of the content of these slides)
1 CS 201 Compiler Construction Lecture 3 Data Flow Analysis.
Graph-Coloring Register Allocation CS153: Compilers Greg Morrisett.
Course Outline Traditional Static Program Analysis –Theory Compiler Optimizations; Control Flow Graphs Data-flow Analysis – today’s class –Classic analyses.
Data-Flow Analysis Framework Domain – What kind of solution is the analysis looking for? Ex. Variables have not yet been defined – Algorithm assigns a.
Register Allocation CS 671 March 27, CS 671 – Spring Register Allocation - Motivation Consider adding two numbers together: Advantages: Fewer.
Lecture 11 – Code Generation Eran Yahav 1 Reference: Dragon 8. MCD
1 CS 201 Compiler Construction Lecture 12 Global Register Allocation.
More Dataflow Analysis CS153: Compilers Greg Morrisett.
© 2006 Pearson Education, Upper Saddle River, NJ All Rights Reserved.Brey: The Intel Microprocessors, 7e Chapter 2 The Microprocessor and its Architecture.
Register Allocation (Slides from Andrew Myers). Main idea Want to replace temporary variables with some fixed set of registers First: need to know which.
PC hardware and x86 3/3/08 Frans Kaashoek MIT
1 Register Allocation Consists of two parts: –register allocation What will be stored in registers –Only unambiguous values –register assignment Which.
Prof. Bodik CS 164 Lecture 171 Register Allocation Lecture 19.
Register Allocation (via graph coloring)
Assembly Language for Intel-Based Computers Chapter 2: IA-32 Processor Architecture Kip Irvine.
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science Emery Berger University of Massachusetts, Amherst Advanced Compilers CMPSCI 710.
Final Code Generation and Code Optimization.
Register Allocation (via graph coloring). Lecture Outline Memory Hierarchy Management Register Allocation –Register interference graph –Graph coloring.
1 Liveness analysis and Register Allocation Cheng-Chia Chen.
ICS312 Set 3 Pentium Registers. Intel 8086 Family of Microprocessors All of the Intel chips from the 8086 to the latest pentium, have similar architectures.
Microprocessor Systems Design I Instructor: Dr. Michael Geiger Spring 2014 Lecture 4: x86 memory.
Web siteWeb site ExamplesExamples Irvine, Kip R. Assembly Language for Intel-Based Computers, Stack Operations Runtime Stack PUSH Operation POP.
4/29/09Prof. Hilfinger CS164 Lecture 381 Register Allocation Lecture 28 (from notes by G. Necula and R. Bodik)
© 2006 Pearson Education, Upper Saddle River, NJ All Rights Reserved.Brey: The Intel Microprocessors, 7e Chapter 2 The Microprocessor and its Architecture.
Register Allocation and Spilling via Graph Coloring G. J. Chaitin IBM Research, 1982.
Assembly Language for Intel-Based Computers, 4 th Edition Chapter 2: IA-32 Processor Architecture (c) Pearson Education, All rights reserved. You.
6.828: PC hardware and x86 Frans Kaashoek
Data Flow Analysis Compiler Baojian Hua
Multitasking Mr. Mahendra B. Salunke Asst. Prof. Dept. of Computer Engg., STES SITS, Narhe, Pune-41 STES Sinhgad Institute of Tech. & Science Dept. of.
Intel Pentium II Processor Brent Perry Pat Reagan Brian Davis Umesh Vemuri.
Fall 2012 Chapter 2: x86 Processor Architecture. Irvine, Kip R. Assembly Language for x86 Processors 6/e, Chapter Overview General Concepts IA-32.
1 October 18, October 18, 2015October 18, 2015October 18, 2015 Azusa, CA Sheldon X. Liang Ph. D. Azusa Pacific University, Azusa, CA 91702, Tel:
U NIVERSITY OF D ELAWARE C OMPUTER & I NFORMATION S CIENCES D EPARTMENT Optimizing Compilers CISC 673 Spring 2009 Register Allocation John Cavazos University.
Dataflow Analysis Topic today Data flow analysis: Section 3 of Representation and Analysis Paper (Section 3) NOTE we finished through slide 30 on Friday.
ANALYSIS AND IMPLEMENTATION OF GRAPH COLORING ALGORITHMS FOR REGISTER ALLOCATION By, Sumeeth K. C Vasanth K.
Other Processors. Having learnt MIPS, we can learn other major processors. Not going to be able to cover everything; will pick on the interesting aspects.
Chapter 2 Parts of a Computer System. 2.1 PC Hardware: Memory.
Final Code Generation and Code Optimization.
Register Usage Keep as many values in registers as possible Keep as many values in registers as possible Register assignment Register assignment Register.
Register Allocation CS 471 November 12, CS 471 – Fall 2007 Register Allocation - Motivation Consider adding two numbers together: Advantages: Fewer.
Register Allocation: Graph Coloring Compiler Baojian Hua
What is a processor ? A “Processor," is a small chip that resides in computers and other electronic devices. It also called “Brain ” of a computer. It.
1 Liveness analysis and Register Allocation Cheng-Chia Chen.
Microprocessors CSE- 341 Dr. Jia Uddin Assistant Professor, CSE, BRAC University Dr. Jia Uddin, CSE, BRAC University.
COMPILERS Liveness Analysis hussein suleman uct csc3003s 2009.
Chapter Overview General Concepts IA-32 Processor Architecture
Stack Operations Dr. Hadi AL Saadi.
Assembly language.
Operating Systems Engineering
x86 Processor Architecture
The compilation process
Other Processors.
Basic Microprocessor Architecture
Register Allocation Noam Rinetzky Text book:
CS 301 Fall 2002 Computer Organization
The Microprocessor & Its Architecture
Tutorial No. 11 Module 10.
Computer Architecture CST 250
Final Code Generation and Code Optimization
Low-Level Thread Dispatching on the x86
Computer Architecture and System Programming Laboratory
Register Allocation Harry Xu CS 142 (b) 05/08/2018.
Presentation transcript:

Register Allocation Harry Xu CS 142 (b) 02/11/2013

Register Allocation Assigning a large number of program variables to a small number of CPU registers for improved performance Motivation – A developer often allocates arbitrarily many variables – The compiler must decide how to allocate these variables to a small, finite set of registers

Basic Idea Variable liveness analysis – Two variables that will be used at the same time cannot be allocated to the same register – Some variables will be held in RAM and loaded in/out for every read/write, a process called spilling Assigning as many variables to registers as possible – Memory accesses are slower

Reaching Definition Analysis A classic dataflow analysis to understand what variables are live simultaneously at a given program point A backward analysis that computes dataflow facts from the end of the program Given an (SSA) statement s, there are four important sets the analysis needs to maintain – Gen[s]: the set of variables used in s – Kill[s]: the set of variables that are assigned values in s – Live-in[s]: the set of variables that are simultaneously live before s is executed – Live-out[s]: the set of variables that are simultaneously live after s is executed

Liveness Analysis (Cond) Initial setup – Live-out[final] = ∅ – Gen[a:= b + c] = {b, c} – Kill[a:= b + c] = {a} Dataflow equations – Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) – Lives-out[s] = ∪ p ∊ succ(s) Live-in[p]

An Example L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Gen(L1) = {}, Kill(L1) = {a} Gen(L2) = {}, Kill(L2) = {b} Gen(L3) = {}, Kill(L3) = {d} Gen(L4) = {}, Kill(L4) = {x} Gen(L5) = {a, b}, Kill(L5) = {} Gen(L6) = {a, b}, Kill(L6) = {c} Gen(L7) = {}, Kill(L7) = {d} Gen(L8) = {}, Kill(L8) = {} Gen(L9) = {}, Kill(L9) = {c} Gen(L10) = {b, d, c}, Kill(L5) = {} Worklist = { L10 }

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Worklist = {L9}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Worklist = {L8}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b,d,c} Live-in = {b, d} Live-out = {b,d} Live-in = {b, d} Worklist = {L7, L5}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b,d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Worklist = {L6, L5}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Worklist = {L5}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Live-out = {b, a, d} Live-in = {b, a, d} Worklist = {L4}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Live-out = {b, a, d} Live-in = {b, a, d} Worklist = {L3}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Live-out = {b, a, d} Live-in = {b, a, d} Live-out = {b, a, d} Live-in = {b, a} Worklist = {L2}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Live-out = {b, a, d} Live-in = {b, a, d} Live-out = {b, a, d} Live-in = {b, a} Live-out = {b, a} Live-in = {a} Worklist = {L1}

Compute Liveness L1: a = 3; L2: b = 5; L3: d = 4; L4: x = 100; L5: if a > b then L6: c = a + b; L7: d = 2; L8: endif L9: c = 4; L10:return b * d + c; Lives-in[s] = Gen[s] ∪ (Lives-out[s] – Kill[s]) Lives-out[s] = ∪ p ∊ succ(s) Live-in[p] Live-out = {} Live-in = {b, d, c} Live-out = {b, d, c} Live-in = {b, d} Live-out = {b, d} Live-in = {b, d} Live-out = {b, d} Live-in = {b} Live-out = {b} Live-in = {b, a} Live-out = {b, a, d} Live-in = {b, a, d} Live-out = {b, a, d} Live-in = {b, a} Live-out = {b, a} Live-in = {a} Live-out = {a} Live-in = { } Worklist = {}

Handling of Loops A fixed-point computation needs to be performed The next statement is not added into the worklist if Live-out and Live-in of the current statement no longer change

Interference Graph Each node represents a variable Each edge connects two variables which can be live at the same time b a c x d Register allocation is reduced to the problem of k- coloring the interference graph

K-Coloring An NP-complete problem For this graph, three colors are sufficient b a c x d

Algorithms Brute-force search – Try every of the k n assignments of k colors to n vertices and checks if each assignment is legal – The process repeats for k = 1, 2, …, n – 1 – Impractical for all but small input graphs Other algorithms – Dynamic programming – Parallel algorithms

X86 Registers General registers – EAX EBX ECX EDX Segment registers – CS DS ES FS GS SS Index and pointers – ESI EDI EBP EIP ESP Indicator EFLAGS Never use EBX and EBP

Output For each register, the set of variables that can be allocated to it The result of this phase will be used by the final code generation phase to guide the actual register allocation