Intermediate Code Generation

Slides:



Advertisements
Similar presentations
CSC 4181 Compiler Construction Code Generation & Optimization.
Advertisements

Chapter 6 Intermediate Code Generation
Synopsys University Courseware Copyright © 2012 Synopsys, Inc. All rights reserved. Compiler Optimization and Code Generation Lecture - 3 Developed By:
Intermediate Code Generation
Course Outline Traditional Static Program Analysis Software Testing
Chapter 9 Code optimization Section 0 overview 1.Position of code optimizer 2.Purpose of code optimizer to get better efficiency –Run faster –Take less.
1 CS 201 Compiler Construction Machine Code Generation.
1 Chapter 8: Code Generation. 2 Generating Instructions from Three-address Code Example: D = (A*B)+C =* A B T1 =+ T1 C T2 = T2 D.
Intermediate Code Generation. 2 Intermediate languages Declarations Expressions Statements.
Chapter 10 Code Optimization. A main goal is to achieve a better performance Front End Code Gen Intermediate Code source Code target Code user Machine-
1 Code Optimization Code produced by compilation algorithms can often be improved (ideally optimized) in terms of run-time speed and the amount of memory.
8 Intermediate code generation
Chapter 8 Intermediate Code Generation. Intermediate languages: Syntax trees, three-address code, quadruples. Types of Three – Address Statements: x :=
1 Compiler Construction Intermediate Code Generation.
Three Address Code Generation Backpatching-I Prepared By: Siddharth Tiwary 04CS3010.
Improving code generation. Better code generation requires greater context Over expressions: optimal ordering of subtrees Over basic blocks: Common subexpression.
CS 536 Spring Intermediate Code. Local Optimizations. Lecture 22.
1 Intermediate representation Goals: –encode knowledge about the program –facilitate analysis –facilitate retargeting –facilitate optimization scanning.
Intermediate Code. Local Optimizations
Improving Code Generation Honors Compilers April 16 th 2002.
Compiler Construction A Compulsory Module for Students in Computer Science Department Faculty of IT / Al – Al Bayt University Second Semester 2008/2009.
Optimizing Compilers Nai-Wei Lin Department of Computer Science and Information Engineering National Chung Cheng University.
Topic #10: Optimization EE 456 – Compiling Techniques Prof. Carl Sable Fall 2003.
1 Structure of a Compiler Front end of a compiler is efficient and can be automated Back end is generally hard to automate and finding the optimum solution.
Compiler Chapter# 5 Intermediate code generation.
1 Code optimization “Code optimization refers to the techniques used by the compiler to improve the execution efficiency of the generated object code”
1 Structure of a Compiler Source Language Target Language Semantic Analyzer Syntax Analyzer Lexical Analyzer Front End Code Optimizer Target Code Generator.
CS 404Ahmed Ezzat 1 CS 404 Introduction to Compiler Design Lecture 10 Ahmed Ezzat.
1 Compiler Construction (CS-636) Muhammad Bilal Bashir UIIT, Rawalpindi.
1 Chapter10: Code generator. 2 Code Generator Source Program Target Program Semantic Analyzer Intermediate Code Generator Code Optimizer Code Generator.
More Code Generation and Optimization Pat Morin COMP 3002.
Lecture 9 Symbol Table and Attributed Grammars
CS 404 Introduction to Compiler Design
Code Optimization Code produced by compilation algorithms can often be improved (ideally optimized) in terms of run-time speed and the amount of memory.
Code Optimization Overview and Examples
High-level optimization Jakub Yaghob
Code Optimization.
Intermediate code Jakub Yaghob
Compiler Construction (CS-636)
Compilers Principles, Techniques, & Tools Taught by Jing Zhang
Compilers.
Compiler Construction
Subject Name:COMPILER DESIGN Subject Code:10CS63
Compiler Optimization and Code Generation
Intermediate Code Generation Part I
Intermediate Code Generation
Unit IV Code Generation
Chapter 6 Intermediate-Code Generation
Intermediate Code Generation Part I
TARGET CODE GENERATION
Code Optimization Overview and Examples Control Flow Graph
Intermediate code generation
Three-address code A more common representation is THREE-ADDRESS CODE . Three address code is close to assembly language, making machine code generation.
Compiler Design 21. Intermediate Code Generation
Intermediate Code Generation Part I
Interval Partitioning of a Flow Graph
Three Address Code Generation – Backpatching
SYNTAX DIRECTED DEFINITION
8 Code Generation Topics A simple code generator algorithm
Compiler Construction
Optimization 薛智文 (textbook ch# 9) 薛智文 96 Spring.
Compiler Construction
Code Generation Part II
Intermediate Code Generation Part I
Compiler Design 21. Intermediate Code Generation
Review: What is an activation record?
Intermediate Code Generating machine-independent intermediate form.
Compiler Construction
Code Optimization.
Presentation transcript:

Intermediate Code Generation

Intermediate Code Generator Introduction Intermediate code is the interface between front end and back end in a compiler Ideally the details of source language are confined to the front end and the details of target machines to the back end. intermediate representations has static type checking and intermediate code generation Parser Static Checker Intermediate Code Generator Code Generator Front end Back end

Variants of syntax trees It is sometimes beneficial to crate a DAG instead of tree for Expressions. This way we can easily show the common sub-expressions and then use that knowledge during code generation Example: a+a*(b-c)+(b-c)*d + + * * d a - b c

SDD for creating DAG’s Production Semantic Rules E -> E1+T T -> (E) T -> id T -> num E.node= new Node(‘+’, E1.node,T.node) E.node= new Node(‘-’, E1.node,T.node) E.node = T.node T.node = E.node T.node = new Leaf(id, id.entry) T.node = new Leaf(num, num.val)

Value-number method for constructing DAG’s = id To entry for i num 10 + + 1 2 3 1 3 i 10 Algorithm Search the array for a node M with label op, left child l and right child r If there is such a node, return the value number M If not create in the array a new node N with label op, left child l, and right child r and return its value We may use a hash table

Three address code In a three address code there is at most one operator at the right side of an instruction Example: + t1 = b – c t2 = a * t1 t3 = a + t2 t4 = t1 * d t5 = t3 + t4 + * * d a - b c

Forms of three address instructions x = y op z x = op y x = y goto L if x goto L and ifFalse x goto L if x relop y goto L Procedure calls using: param x call p,n y = call p,n x = y[i] and x[i] = y x = &y and x = *y and *x =y

Example do i = i+1; while (a[i] < v); L: t1 = i + 1 i = t1 t3 = a[t2] if t3 < v goto L 100: t1 = i + 1 101: i = t1 102: t2 = i * 8 103: t3 = a[t2] 104: if t3 < v goto 100 Symbolic labels Position numbers

Data structures for three address codes Quadruples Has four fields: op, arg1, arg2 and result Triples Temporaries are not used and instead references to instructions are made Indirect triples In addition to triples we use a list of pointers to triples

Example Three address code b * minus c + b * minus c Quadruples t1 = minus c t2 = b * t1 t3 = minus c t4 = b * t3 t5 = t2 + t4 a = t5 b * minus c + b * minus c Quadruples Triples Indirect Triples op arg1 arg2 result op arg1 arg2 op op arg1 arg2 minus c t1 minus c 35 (0) minus c * b t1 t2 1 * b (0) 36 (1) 1 * b (0) minus c t3 2 minus c 37 (2) 2 minus c * b t3 t4 3 * b (2) 38 (3) 3 * b (2) + t2 t4 t5 4 + (1) (3) 39 (4) 4 + (1) (3) = t5 a 5 = a (4) 40 (5) 5 = a (4)

Type Expressions Example: int[2][3] array(2,array(3,integer)) A basic type is a type expression A type name is a type expression A type expression can be formed by applying the array type constructor to a number and a type expression. A record is a data structure with named field A type expression can be formed by using the type constructor g for function types If s and t are type expressions, then their Cartesian product s*t is a type expression Type expressions may contain variables whose values are type expressions

Type Equivalence They are the same basic type. They are formed by applying the same constructor to structurally equivalent types. One is a type name that denotes the other.

Declarations

Storage Layout for Local Names Computing types and their widths

Addressing Array Elements Layouts for a two-dimensional array:

Semantic actions for array reference

Translation of Array References Nonterminal L has three synthesized attributes: L.addr L.array L.type

Backpatching Previous codes for Boolean expressions insert symbolic labels for jumps It therefore needs a separate pass to set them to appropriate addresses We can use a technique named backpatching to avoid this We assume we save instructions into an array and labels will be indices in the array For nonterminal B we use two attributes B.truelist and B.falselist together with following functions: makelist(i): create a new list containing only I, an index into the array of instructions Merge(p1,p2): concatenates the lists pointed by p1 and p2 and returns a pointer to the concatenated list Backpatch(p,i): inserts i as the target label for each of the instruction on the list pointed to by p

Backpatching for Boolean Expressions

Code Optimization

A main goal is to achieve a better performance Front End Code Gen source Code target Code Intermediate Code Machine-independent Compiler optimizer user Machine-dependent Compiler optimizer

Two levels Machine independent code opt Machine dependent code-op Control Flow analysis Data Flow analysis Transformation Machine dependent code-op Register allocation Utilization of special instructions.

Basic Block BB is a sequence of consecutive statements in which the flow control enters at the beginning and leaves at the end w/o halt or possible branching except at the end

Basic Block

Principle sources of optimization Local optimization: within a basic block Global optimization: otherwise Mixed

Function-Preserving Transformation Improving performance w/o changing fn. Techniques Common subexpression Elimination Copy Propagation Dead-code elimination Constant folding

Common sub expression Elimination An occurrence of an expression E is common sub expression if E was previously computed and the values of variables in E have not changed since.

Copy Propagation An idea behind this technique is to use g for f whenever possible after the copy of f := g before x := t3 a[t7] := t5 a[t10] := x Goto b2 After x := t3 a[t7] := t5 a[t10] := t3 Goto b2

Dead code elimination Remove unreachable code If (debug) print … Many times, debug := false

Loop optimizations Beyond basic block Three important techniques Code motion Induction-variable elimination Reduction in strength

Code motion after T = limit – 2 While ( I <= t) Move code outside the loop since there are potential many iterations Look for expressions that yeild the same result independent of the iterations. before While ( I <= limit – 2). after T = limit – 2 While ( I <= t)

Induction-variable elimination & Reduction in strength Look for induction variables for strength reductions E.g. a pattern of changes in a lock step B3: j = j - 1 t4 = 4 *j t5 = a [ t4] If t5 > v goto B3 B3: j = j - 1 t4 = t4 -4 t5 = a [ t4] If t5 > v goto B3

Others optimizations Optimizations for Basic blocks Reducible flow graph Global Data flow analysis Machine dependent Optimizations