1 / 98

Code Generation

Code Generation. CS 540 George Mason University. Compiler Architecture. Intermediate Language. Intermediate Language. Scanner (lexical analysis). Parser (syntax analysis). Semantic Analysis (IC generator). Code Optimizer. Code Generator. Source language. Target language.

btownsend
Télécharger la présentation

Code Generation

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. Code Generation CS 540 George Mason University

  2. Compiler Architecture Intermediate Language Intermediate Language Scanner (lexical analysis) Parser (syntax analysis) Semantic Analysis (IC generator) Code Optimizer Code Generator Source language Target language tokens Syntactic structure Symbol Table CS 540 Spring 2009 GMU

  3. Code Generation The code generation problem is the task of mapping intermediate code to machine code. Machine Dependent Optimization! Requirements: • Correctness • Efficiency CS 540 Spring 2009 GMU

  4. Issues: • Input language: intermediate code (optimized or not) • Target architecture: must be well understood • Interplay between • Instruction Selection • Register Allocation • Instruction Scheduling CS 540 Spring 2009 GMU

  5. Instruction Selection • There may be a large number of ‘candidate’ machine instructions for a given IC instruction • each has own cost and constraints • cost may be influenced by surrounding context • different architectures have different needs that must be considered: speed, power constraints, space … CS 540 Spring 2009 GMU

  6. Instruction Scheduling • Choosing the order of instructions to best utilize resources • Architecture • RISC (pipeline) • Vector processing • Superscalar and VLIW • Memory hierarchy • Ordering to decrease memory fetching • Latency tolerance – doing something when data does have to be fetched CS 540 Spring 2009 GMU

  7. Register Allocation How to best use the bounded number of registers. Complications: • special purpose registers • operators requiring multiple registers. CS 540 Spring 2009 GMU

  8. Naïve Approach to Code Generation Simple code generation algorithm: Define a target code sequence to each intermediate code statement type. This is basically what we did earlier when creating the intermediate code (i.e. SPIM in project 3) Why is this not sufficient? CS 540 Spring 2009 GMU

  9. Example Target: SPIM Assembly Language General Characteristics • Byte-addressable with 4-byte words • N general -purpose registers • Three-address instructions: op destination, source1, source2 CS 540 Spring 2009 GMU

  10. Mapping from Intermediate code Simple code generation algorithm: Define a target code sequence to each intermediate code statement type. CS 540 Spring 2009 GMU

  11. Consider the C statement: a[i] = d[c[k]]; t1 := c[k] la $t0,c lw $t1,k add $t0,$t0,$t1 lw $t0,($t0) sw $t0,t1 t2 := d[t1] la $t0,d lw $t1,t1 add $t0,$t0,$t1 lw $t0,($t0) sw $t0,t2 a[i] := t2 la $t0,a lw $t1,i add $t0,$t0,$t1 lw $t1,t2 sw $t1,($t0) We use 15 instructions (12 load/store + 3 arithmetic) and allocate space for two temporaries (but only use two registers). CS 540 Spring 2009 GMU

  12. Problems with this approach • Local decisions do not produce good code. • Does not take temporary variables into account Get rid of the temporaries (reduce load/store): la $t0,c lw $t1,k add $t0,$t0,$t1 # address of c[k] lw $t0,($t0) la $t1,d add $t1,$t1,$t0 # address of d[c[k]] lw $t1,($t1) la $t0,a lw $t2,i add $t0,$t0,$t2 # address of a[i] sw $t1,($t0) CS 540 Spring 2009 GMU

  13. Need a way to generate machine code based on past and future use of the data. • Analyze the code • Use results of analysis CS 540 Spring 2009 GMU

  14. Representing Intermediate Code: Control Flow Graph - CFG CFG = < V, E, Entry >, where V = vertices or nodes, representing an instruction or basic block (group of statements). E = (V x V) edges, potential flow of control Entry is an element of V, the unique program entry 2 1 3 4 5 CS 540 Spring 2009 GMU

  15. Basic Blocks A basic block is a sequence of consecutive statements with single entry/single exit: • flow of control only enters at the beginning • Flow of control only leaves at the end • Variants: single entry/multiple exit, multiple entry/single exit CS 540 Spring 2009 GMU

  16. Generating CFGs from Intermediate Code • Partition intermediate code into basic blocks • Add edges corresponding to control flow between blocks • Unconditional goto • Conditional goto – multiple edges • No goto at end – control passes to first statement of next block CS 540 Spring 2009 GMU

  17. Partitioning into basic blocks Input: A sequence of intermediate code statements • Determine the leaders, the first statements of basic blocks. • The first statement in the sequence is a leader. • Any statement that is the target of a goto (conditional or unconditional) is a leader. • Any statement immediately following a goto (conditional or unconditional) is a leader. • For each leader, its basic block is the leader and all statements up to, but not including, the next leader or the end of the program. CS 540 Spring 2009 GMU

  18. (1) i := m – 1 (16) t7 := 4 * i • j := n (17) t8 := 4 * j • t1 := 4 * n (18) t9 := a[t8] • v := a[t1] (19) a[t7] := t9 • i := i + 1 (20) t10 := 4 * j • t2 := 4 * i (21) a[t10] := x • t3 := a[t2] (22) goto (5) • if t3 < v goto (5) (23) t11 := 4 * i • j := j - 1 (24) x := a[t11] • t4 := 4 * j (25) t12 := 4 * i • t5 := a[t4] (26) t13 := 4 * n • If t5 > v goto (9) (27) t14 := a[t13] • if i >= j goto (23) (28) a[t12] := t14 • t6 := 4*i (29) t15 := 4 * n • x := a[t6] (30) a[t15] := x CS 540 Spring 2009 GMU

  19. (1)i := m – 1 (16) t7 := 4 * i • j := n (17) t8 := 4 * j • t1 := 4 * n (18) t9 := a[t8] • v := a[t1] (19) a[t7] := t9 • i := i + 1 (20) t10 := 4 * j • t2 := 4 * i (21) a[t10] := x • t3 := a[t2] (22) goto (5) • if t3 < v goto (5) (23)t11 := 4 * i • j := j - 1 (24) x := a[t11] • t4 := 4 * j (25) t12 := 4 * i • t5 := a[t4] (26) t13 := 4 * n • If t5 > v goto (9) (27) t14 := a[t13] • if i >= j goto (23) (28) a[t12] := t14 • t6 := 4*i (29) t15 := 4 * n • x := a[t6] (30) a[t15] := x CS 540 Spring 2009 GMU

  20. (1)i := m – 1 (16) t7 := 4 * i • j := n (17) t8 := 4 * j • t1 := 4 * n (18) t9 := a[t8] • v := a[t1] (19) a[t7] := t9 • i := i + 1 (20) t10 := 4 * j • t2 := 4 * i (21) a[t10] := x • t3 := a[t2] (22) goto (5) • if t3 < v goto (5) (23)t11 := 4 * i • j := j - 1 (24) x := a[t11] • t4 := 4 * j (25) t12 := 4 * i • t5 := a[t4] (26) t13 := 4 * n • If t5 > v goto (9) (27) t14 := a[t13] • if i >= j goto (23) (28) a[t12] := t14 • t6 := 4*i (29) t15 := 4 * n • x := a[t6] (30) a[t15] := x CS 540 Spring 2009 GMU

  21. Instruction Scheduling • Choosing the order of instructions to best utilize resources (CPU, registers, …) • Consider RISC pipeline Architecture: IF – Instruction Fetch ID – Instruction Decode EX – Execute MA – Memory access WB – Write back IF ID EX MA WB IF ID EX MA WB ID EX MA IF WB time CS 540 Spring 2009 GMU

  22. Hazards • Structural hazards – machine resources limit overlap • Data hazards – output of instruction needed by later instruction • Control hazards – branching Pipeline stalls! CS 540 Spring 2009 GMU

  23. Data Hazards Memory latency: lw R1,0(R2) IF ID EX MA WB IF ID EX stall MA WB add R3,R1,R4 Can’t add until register R1 is loaded. CS 540 Spring 2009 GMU

  24. Data Hazards Instruction latency: addf R3,R1,R2 IF ID EX EX MA WB IF ID stall EX EX MA WB addf R3,R3,R4 Assumes floating point ops take 2 execute cycles CS 540 Spring 2009 GMU

  25. Dealing with Data Hazards • Typical solution is to re-order statements. • To do this without changing the outcome, need to understand the relationship (dependences) between statements. addf R3,R1,R2 IF ID EX EX MA WB IF ID EX MA WB add R5,R5,R6 IF ID EX EX MA WB addf R3,R3,R4 CS 540 Spring 2009 GMU

  26. Instruction Scheduling • Many operations have non-zero latencies • Execution time is order-dependent Assumed latencies (conservative) Operation Cycles load 3 store 3 loadI 1 add 1 mult 2 fadd 1 fmult 2 shift 1 branch 0 to 8 • Loads & stores may or may not block • Non-blocking fill those issue slots • Scheduler should hide the latencies CS 540 Spring 2009 GMU

  27. Schedule 1 1 lw $t0,w add $t0,$t0,$t0 lw $t1,x mult $t0,$t0,$t1 lw $t1,y mult $t0,$t0,$t1 lw $t1,z mult $t0,$t0,$t1 sw $t0,w done at time 21 Schedule 2 lw $t0,w lw $t1,x 3 lw $t2,y add $t0,$t0,$t0 mult $t0,$t0,$t1 lw $t1,z mult $t0,$t0,$t2 mult $t0,$t0,$t1 sw $t0,w done at time 14 w  w * 2 * x * y * z Issue time CS 540 Spring 2009 GMU

  28. Control Hazards IF ID EX MA WB IF ID EX IF ID EX MA WB Stall if branch is made CS 540 Spring 2009 GMU

  29. Branch Scheduling Problem: • Branches often take some number of cycles to complete, creating delay slots. • Can be a delay between a compare b and its associated branch. • Even unconditional branches have delay slots A compiler will try to fill these delay slots with valid instructions (rather than nop). CS 540 Spring 2009 GMU

  30. Example Assume loads take 2 cycles and branches have a delay slot. 7 cycles CS 540 Spring 2009 GMU

  31. Example Can look at the dependencies between the statements and move a statement into the delay slot. 5 cycles Filling Delay branches 2 1 4 3 CS 540 Spring 2009 GMU

  32. Filling the delay slot in the SPARC architecture N Y CS 540 Spring 2009 GMU

  33. Register Allocation How to best use the bounded number of registers. • Reducing load/store operations • What are best values to keep in registers? • When can we ‘free’ registers? Complications: • special purpose registers • operators requiring multiple registers. CS 540 Spring 2009 GMU

  34. Register Allocation Algorithms • Local (basic block level): • Basic - using liveness information • Register Allocation using graph coloring • Global (CFG) • Need to use global liveness information CS 540 Spring 2009 GMU

  35. Basic Code Generation • Deal with each basic block individually. • Compute liveness information for the block. • Using liveness information, generate code that uses registers as well as possible. • At end, generate code that saves any live values left in registers. . CS 540 Spring 2009 GMU

  36. Concept: Variable Liveness • For some statement s, variable x is live if • there is a statement t that uses x • there is a path in the CFG from s to t • there is no assignment to x on some path from s to t • A variable is live at a given point in the source code if it could be used before it is defined. • Liveness tells us whether we care about the value held by a variable. CS 540 Spring 2009 GMU

  37. Example: When is a live? a := b + c t1 := a * a b := t1 + a c := t1 * b t2 := c + b a := t2 + t2 a is live Assume a,b and c are used after this basic block CS 540 Spring 2009 GMU

  38. Example: When is b live? a := b + c t1 := a * a b := t1 + a c := t1 * b t2 := c + b a := t2 + t2 Assume a,b and c are used after this basic block CS 540 Spring 2009 GMU

  39. Computing live status in basic blocks Input: A basic block. Output: For each statement, set of live variables • Initially all non-temporary variables go into live set (L). • for i = last statement to first statement: for statement i: x := y op z • Attach L to statement i. • Remove x from set L. • Add y and z to set L. CS 540 Spring 2009 GMU

  40. Example live = { a := b + c live = { t1 := a * a live = { b := t1 + a live = { c := t1 * b live = { t2 := c + b live = { a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  41. Example Answers live = {} a := b + c live = {} t1 := a * a live = {} b := t1 + a live = {} c := t1 * b live = {} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  42. Example Answers live = {} a := b + c live = {} t1 := a * a live = {} b := t1 + a live = {} c := t1 * b live = {b,c} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  43. Example Answers live = {} a := b + c live = {} t1 := a * a live = {} b := t1 + a live = { b,t1} c := t1 * b live = {b,c} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  44. Example Answers live = {} a := b + c live = {} t1 := a * a live = {a,t1} b := t1 + a live = { b,t1} c := t1 * b live = {b,c} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  45. Example Answers live = {} a := b + c live = {a} t1 := a * a live = {a,t1} b := t1 + a live = { b,t1} c := t1 * b live = {b,c} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  46. Example Answers live = {b,c}  what does this mean??? a := b + c live = {a} t1 := a * a live = {a,t1} b := t1 + a live = { b,t1} c := t1 * b live = {b,c} t2 := c + b live = {b,c,t2} a := t2 + t2 live = {a,b,c} CS 540 Spring 2009 GMU

  47. Basic Code Generation • Deal with each basic block individually. • Compute liveness information for the block. • Using liveness information, generate code that uses registers as well as possible. • At end, generate code that saves any live values left in registers. . CS 540 Spring 2009 GMU

  48. Basic Code Generation Idea: Deal with the instructions from beginning to end. For each instruction, • Use registers whenever possible. • A non-live value in a register can be discarded, freeing that register. Data Structures: • Register Descriptor - register status (empty, full) and contents (one or more "values") • Address descriptor - the location (or locations) where the current value for a variable can be found (register, stack, memory) . CS 540 Spring 2009 GMU

  49. Instruction type: x := y op z • Choose Rx, the register where the result (x) will be kept. • If y (or z) is in a register t alone and not live, choose Rx = t • Else if there is a free register t, choose Rx = t • Else must free up a register for Rx • Find Ry. If y is not in a register, generate load into a free register (or Rx) • Find Rz. If z is not in a register, generate load into a free register (can use Rx if not used by y). • Generate: OP Rx, Ry, Rz CS 540 Spring 2009 GMU

  50. Instruction type: x := y op z • Update information about the current best location of x • If x is in a register, update that register’s information • If y and/or z are not live after this instruction, update register and address descriptors according. CS 540 Spring 2009 GMU

More Related