Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control...
Transcript of Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control...
![Page 1: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/1.jpg)
Optimising CompilersComputer Science Tripos Part II - Lent 2007
Tom Stuart
![Page 2: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/2.jpg)
A non-optimising compiler
intermediate code
parse tree
token stream
character stream
target code
lexing
parsing
translation
code generation
![Page 3: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/3.jpg)
An optimising compiler
intermediate code
parse tree
token stream
character stream
target code
optimisation
optimisation
optimisation
decompilation
![Page 4: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/4.jpg)
Optimisation(really “amelioration”!)
• Smaller
• Faster
• Cheaper (e.g. lower power consumption)
Good humans write simple, maintainable, general code.
Compilers should then remove unused generality,and hence hopefully make the code:
![Page 5: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/5.jpg)
Optimisation =
Analysis+
Transformation
![Page 6: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/6.jpg)
Analysis + Transformation
• Transformation does something dangerous.
• Analysis determines whether it’s safe.
![Page 7: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/7.jpg)
Analysis + Transformation
• An analysis shows that your program has some property...
• ...and the transformation is designed to be safe for all programs with that property...
• ...so it’s safe to do the transformation.
![Page 8: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/8.jpg)
int main(void){ return 42;}
int f(int x){ return x * 2;}
Analysis + Transformation
![Page 9: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/9.jpg)
int main(void){ return 42;}
int f(int x){ return x * 2;}
Analysis + Transformation
✓
![Page 10: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/10.jpg)
int main(void){ return f(21);}
int f(int x){ return x * 2;}
Analysis + Transformation
![Page 11: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/11.jpg)
int main(void){ return f(21);}
int f(int x){ return x * 2;}
Analysis + Transformation
✗
![Page 12: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/12.jpg)
while (i <= k*2) { j = j * i; i = i + 1;}
Analysis + Transformation
![Page 13: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/13.jpg)
int t = k * 2;while (i <= t) { j = j * i; i = i + 1;}
✓
Analysis + Transformation
![Page 14: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/14.jpg)
while (i <= k*2) { k = k - i; i = i + 1;}
Analysis + Transformation
![Page 15: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/15.jpg)
int t = k * 2;while (i <= t) { k = k - i; i = i + 1;}
✗
Analysis + Transformation
![Page 16: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/16.jpg)
Stack-oriented codeiload 0iload 1iaddiload 2iload 3iaddimulireturn
?
![Page 17: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/17.jpg)
3-address codeMOV t32,arg1MOV t33,arg2ADD t34,t32,t33MOV t35,arg3MOV t36,arg4ADD t37,t35,t36MUL res1,t34,t37EXIT
![Page 18: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/18.jpg)
int fact (int n) { if (n == 0) { return 1; } else { return n * fact(n-1); }}
C into 3-address code
![Page 19: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/19.jpg)
C into 3-address code ENTRY fact MOV t32,arg1 CMPEQ t32,#0,lab1 SUB arg1,t32,#1 CALL fact MUL res1,t32,res1 EXITlab1: MOV res1,#1 EXIT
![Page 20: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/20.jpg)
Flowgraphs
Part A: Classical ‘Dataflow’ Optimisations
1 Introduction
Recall the structure of a simple non-optimising compiler (e.g. from CST Part Ib).
!"
#$character
stream!
lex
!"
#$token
stream!
syn
!"
#$
parsetree
!
trn
!"
#$intermediate
code!
gen
!"
#$
targetcode
In such a compiler “intermediate code” is typically a stack-oriented abstract machine code(e.g. OCODE in the BCPL compiler or JVM for Java). Note that stages ‘lex’, ‘syn’ and ‘trn’are in principle source language-dependent, but not target architecture-dependent whereasstage ‘gen’ is target dependent but not language dependent.
To ease optimisation (really ‘amelioration’ !) we need an intermediate code which makesinter-instruction dependencies explicit to ease moving computations around. Typically weuse 3-address code (sometimes called ‘quadruples’). This is also near to modern RISC archi-tectures and so facilitates target-dependent stage ‘gen’. This intermediate code is stored ina flowgraph G—a graph whose nodes are labelled with 3-address instructions (or later ‘basicblocks’). We write
pred(n) = {n′ | (n′, n) ∈ edges(G)}succ(n) = {n′ | (n, n′) ∈ edges(G)}
for the sets of predecessor and successor nodes of a given node; we assume common graphtheory notions like path and cycle.
Forms of 3-address instructions (a, b, c are operands, f is a procedure name, and lab is alabel):
• ENTRY f : no predecessors;
• EXIT: no successors;
• ALU a, b, c: one successor (ADD, MUL, . . . );
• CMP〈cond〉 a, b, lab: two successors (CMPNE, CMPEQ, . . . ) — in straight-line code theseinstructions take a label argument (and fall through to the next instruction if the branchdoesn’t occur), whereas in a flowgraph they have two successor edges.
Multi-way branches (e.g. case) can be considered for this course as a cascade of CMP in-structions. Procedure calls (CALL f) and indirect calls (CALLI a) are treated as atomicinstructions like ALU a, b, c. Similarly one distinguishes MOV a, b instructions (a special caseof ALU ignoring one operand) from indirect memory reference instructions (LDI a, b andSTI a, b) used to represent pointer dereference including accessing array elements. Indirectbranches (used for local goto 〈exp〉) terminate a basic block (see later); their successors mustinclude all the possible branch targets (see the description of Fortran ASSIGNED GOTO).
4
• A graph representation of a program
• Each node stores 3-address instruction(s)
• Each edge represents (potential) control flow:
![Page 21: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/21.jpg)
FlowgraphsENTRY fact
MOV t32,arg1
CMPEQ t32,#0
SUB arg1,t32,#1
CALL fact
MUL res1,t32,res1
EXIT
MOV res1,#1
EXIT
![Page 22: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/22.jpg)
Basic blocks
A maximal sequence of instructions n1, ..., nk which have
• exactly one predecessor (except possibly for n1)
• exactly one successor (except possibly for nk)
![Page 23: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/23.jpg)
Basic blocksENTRY fact
MOV t32,arg1
CMPEQ t32,#0
SUB arg1,t32,#1
CALL fact
MUL res1,t32,res1
EXIT
MOV res1,#1
EXIT
![Page 24: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/24.jpg)
Basic blocks
ENTRY fact
MOV t32,arg1
CMPEQ t32,#0
SUB arg1,t32,#1
CALL fact
MUL res1,t32,res1
EXIT
MOV res1,#1
EXIT
![Page 25: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/25.jpg)
Basic blocks
MOV t32,arg1
CMPEQ t32,#0
SUB arg1,t32,#1
CALL fact
MUL res1,t32,res1
MOV res1,#1
ENTRY fact
EXIT
![Page 26: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/26.jpg)
Basic blocks
A basic block doesn’t contain any interesting control flow.
![Page 27: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/27.jpg)
Basic blocks
Reduce time and space requirementsfor analysis algorithms
by calculating and storing data flow information
once per block(and recomputing within a block if required)
instead of
once per instruction.
![Page 28: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/28.jpg)
Basic blocks
MOV t32,arg1MOV t33,arg2ADD t34,t32,t33MOV t35,arg3MOV t36,arg4ADD t37,t35,t36MUL res1,t34,t37
![Page 29: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/29.jpg)
Basic blocks
MOV t32,arg1MOV t33,arg2ADD t34,t32,t33MOV t35,arg3MOV t36,arg4ADD t37,t35,t36MUL res1,t34,t37?
![Page 30: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/30.jpg)
Basic blocks
?
?
?
?
?
![Page 31: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/31.jpg)
Types of analysis
• Within basic blocks (“local” / “peephole”)
• Between basic blocks (“global” / “intra-procedural”)
• e.g. live variable analysis, available expressions
• Whole program (“inter-procedural”)
• e.g. unreachable-procedure elimination
(and hence optimisation)
Scope:
![Page 32: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/32.jpg)
Peephole optimisation
ADD t32,arg1,#1MOV r0,r1MOV r1,r0MUL t33,r0,t32
ADD t32,arg1,#1MOV r0,r1MUL t33,r0,t32
matchesMOV x,yMOV y,x
withMOV x,y
replace
![Page 33: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/33.jpg)
Types of analysis
• Control flow
• Discovering control structure (basic blocks, loops, calls between procedures)
• Data flow
• Discovering data flow structure (variable uses, expression evaluation)
(and hence optimisation)
Type of information:
![Page 34: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/34.jpg)
Finding basic blocks
1. Find all the instructions which are leaders:
• the first instruction is a leader;
• the target of any branch is a leader; and
• any instruction immediately following a branch is a leader.
2. For each leader, its basic block consists of itself and all instructions up to the next leader.
![Page 35: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/35.jpg)
ENTRY fact MOV t32,arg1 CMPEQ t32,#0,lab1 SUB arg1,t32,#1 CALL fact MUL res1,t32,res1 EXITlab1: MOV res1,#1 EXIT
Finding basic blocks
![Page 36: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/36.jpg)
ENTRY fact MOV t32,arg1 CMPEQ t32,#0,lab1 SUB arg1,t32,#1 CALL fact MUL res1,t32,res1 EXITlab1: MOV res1,#1 EXIT
Finding basic blocks
![Page 37: Optimising Compilers - University of Cambridge · 2007. 2. 4. · Types of analysis • Control flow • Discovering control structure (basic blocks, loops, calls between procedures)](https://reader035.fdocuments.net/reader035/viewer/2022071523/613cbe0c4c23507cb635944b/html5/thumbnails/37.jpg)
Summary• Structure of an optimising compiler
• Why optimise?
• Optimisation = Analysis + Transformation
• 3-address code
• Flowgraphs
• Basic blocks
• Types of analysis
• Locating basic blocks