Code optimization in GCC S ebastian Pop Universit e Louis Pasteur - - PowerPoint PPT Presentation

code optimization in gcc
SMART_READER_LITE
LIVE PREVIEW

Code optimization in GCC S ebastian Pop Universit e Louis Pasteur - - PowerPoint PPT Presentation

Code optimization in GCC S ebastian Pop Universit e Louis Pasteur Strasbourg FRANCE Code optimization in GCC p.1 Introduction GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . . Code optimization in GCC


slide-1
SLIDE 1

Code optimization in GCC

S´ ebastian Pop Universit´ e Louis Pasteur Strasbourg FRANCE

Code optimization in GCC – p.1

slide-2
SLIDE 2

Introduction

GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . .

Code optimization in GCC – p.2

slide-3
SLIDE 3

Introduction

GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . . Generates code for 43 different architectures: i386, ia64, m68k, sparc, . . .

Code optimization in GCC – p.2

slide-4
SLIDE 4

Introduction

GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . . Generates code for 43 different architectures: i386, ia64, m68k, sparc, . . . Main compiler in GNU world

Code optimization in GCC – p.2

slide-5
SLIDE 5

Introduction

GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . . Generates code for 43 different architectures: i386, ia64, m68k, sparc, . . . Main compiler in GNU world Apple’s system compiler.

Code optimization in GCC – p.2

slide-6
SLIDE 6

Introduction

GCC : GNU Compiler Collection C, C++, Java, Ada, Frotran, Mercury, . . . Generates code for 43 different architectures: i386, ia64, m68k, sparc, . . . Main compiler in GNU world Apple’s system compiler. Industrial compiler.

Code optimization in GCC – p.2

slide-7
SLIDE 7

Front-ends / back-end

GCC

Code optimization in GCC – p.3

slide-8
SLIDE 8

Front-ends / back-end

gcc g++ gcj g77

Front−ends

GCC

Code optimization in GCC – p.3

slide-9
SLIDE 9

Front-ends / back-end

gcc g++ gcj g77

Front−ends

i386 ia64 m68k sparc

Machine Description

GCC

Code optimization in GCC – p.3

slide-10
SLIDE 10

Front-ends / back-end

gcc g++ gcj g77

Front−ends

i386 ia64 m68k sparc

Machine Description

RTL

Back−end

GCC

Code optimization in GCC – p.3

slide-11
SLIDE 11

Front-ends / back-end

gcc g++ gcj g77

Front−ends

i386 ia64 m68k sparc

Machine Description

RTL

Back−end

GCC

GAS Assembler

Code optimization in GCC – p.3

slide-12
SLIDE 12

Exemple: cross-compilation

Suppose that I want to generate Sparc code:

  • target=sparc

Code optimization in GCC – p.4

slide-13
SLIDE 13

Exemple: cross-compilation

Suppose that I want to generate Sparc code:

  • target=sparc

I build GCC on my laptop: -build=i586

Code optimization in GCC – p.4

slide-14
SLIDE 14

Exemple: cross-compilation

Suppose that I want to generate Sparc code:

  • target=sparc

I build GCC on my laptop: -build=i586 and I run the compiler on my laptop:

  • host=i586

Code optimization in GCC – p.4

slide-15
SLIDE 15

Exemple: cross-compilation

Suppose that I want to generate Sparc code:

  • target=sparc

I build GCC on my laptop: -build=i586 and I run the compiler on my laptop:

  • host=i586

../gcc/configure -target=sparc -build=i586

  • host=i586

Code optimization in GCC – p.4

slide-16
SLIDE 16

Exemple: cross-compilation

gcc g++ gcj g77

Front−ends

i386 ia64 m68k sparc

Machine Description

RTL

Back−end

GCC

GAS Assembler

Code optimization in GCC – p.5

slide-17
SLIDE 17

Exemple: cross-compilation

gcc g++ gcj g77

Front−ends

RTL

Back−end

GCC

sparc

Machine Description

  • 1. Select SPARC machine

description SPARC specific

Code optimization in GCC – p.5

slide-18
SLIDE 18

Exemple: cross-compilation

gcc g++ gcj g77

Front−ends

RTL

Back−end

GCC

sparc

Machine Description

  • 1. Select SPARC machine

SPARC specific SPARC assembler code description

  • 2. Compile

Code optimization in GCC – p.5

slide-19
SLIDE 19

RTL Optimizations

An optimization pass optimizes all front-ends.

Code optimization in GCC – p.6

slide-20
SLIDE 20

RTL Optimizations

An optimization pass optimizes all front-ends. Machine dependent optimizations.

Code optimization in GCC – p.6

slide-21
SLIDE 21

RTL Optimizations

An optimization pass optimizes all front-ends. Machine dependent optimizations. Types and memory structures after lowering to RTL contain less information.

Memory accesses are under their canonical form: <start adress + offset>

Code optimization in GCC – p.6

slide-22
SLIDE 22

RTL Optimizations

An optimization pass optimizes all front-ends. Machine dependent optimizations. Types and memory structures after lowering to RTL contain less information.

Memory accesses are under their canonical form: <start adress + offset>

Idea: we’d like to have

Code optimization in GCC – p.6

slide-23
SLIDE 23

RTL Optimizations

An optimization pass optimizes all front-ends. Machine dependent optimizations. Types and memory structures after lowering to RTL contain less information.

Memory accesses are under their canonical form: <start adress + offset>

Idea: we’d like to have architecture independent optimizations.

Code optimization in GCC – p.6

slide-24
SLIDE 24

RTL Optimizations

An optimization pass optimizes all front-ends. Machine dependent optimizations. Types and memory structures after lowering to RTL contain less information.

Memory accesses are under their canonical form: <start adress + offset>

Idea: we’d like to have architecture independent optimizations.

  • n high level representations.

Code optimization in GCC – p.6

slide-25
SLIDE 25

Intermediate Representations

GCC

RTL

gcc g++ gcj g77 Machine description Translation follows machines specificities

Code optimization in GCC – p.7

slide-26
SLIDE 26

Intermediate Representations

GCC

Mid−RTL RTL

gcc g++ gcj g77 Machine description Translation Progressive transition from AST to RTL Architecture independent IR

Code optimization in GCC – p.7

slide-27
SLIDE 27

Intermediate Representations

GCC

Mid−RTL RTL

gcc g++ gcj g77

Simple

Machine description Simplify Translation Progressive transition from AST to RTL Architecture independent IR Imperative Normal Form Language independent representation

Code optimization in GCC – p.7

slide-28
SLIDE 28

Abstract Syntax Trees

Simple linked list for statement nodes.

Code optimization in GCC – p.8

slide-29
SLIDE 29

Abstract Syntax Trees

Simple linked list for statement nodes. Manipulation of nodes through a macro interface: TREE_CHAIN, TREE_OPERAND,

TREE_CODE, ...

Code optimization in GCC – p.8

slide-30
SLIDE 30

Abstract Syntax Trees

Simple linked list for statement nodes. Manipulation of nodes through a macro interface: TREE_CHAIN, TREE_OPERAND,

TREE_CODE, ...

Data structures hidden.

Code optimization in GCC – p.8

slide-31
SLIDE 31

Abstract Syntax Trees

Simple linked list for statement nodes. Manipulation of nodes through a macro interface: TREE_CHAIN, TREE_OPERAND,

TREE_CODE, ...

Data structures hidden. AST nodes are typed:

allows tree-checking during development.

Code optimization in GCC – p.8

slide-32
SLIDE 32

AST: example

a = (−−b) * 7; x = y+z;

Code optimization in GCC – p.9

slide-33
SLIDE 33

AST: example

EXPR_STMT

a = (−−b) * 7; x = y+z; a = (−−b) * 7;

Code optimization in GCC – p.9

slide-34
SLIDE 34

AST: example

EXPR_STMT EXPR_STMT

TREE_CHAIN (S) a = (−−b) * 7; x = y+z; a = (−−b) * 7; x = y+z;

Code optimization in GCC – p.9

slide-35
SLIDE 35

AST: example

EXPR_STMT MODIFY_EXPR EXPR_STMT

a = (−−b) * 7; x = y+z; EXPR_STMT_EXPR (S)

Code optimization in GCC – p.9

slide-36
SLIDE 36

AST: example

EXPR_STMT MULT_EXPR MODIFY_EXPR EXPR_STMT VAR_DECL

TREE_OPERAND (M, 1) a = (−−b) * 7; x = y+z; TREE_OPERAND (M, 0)

Code optimization in GCC – p.9

slide-37
SLIDE 37

AST: example

EXPR_STMT PREDECREMENT_EXPR MULT_EXPR IDENTIFIER_NODE

a

INTEGER_CST

7

MODIFY_EXPR EXPR_STMT VAR_DECL

a = (−−b) * 7; x = y+z; DECL_NAME (V)

Code optimization in GCC – p.9

slide-38
SLIDE 38

AST: example

EXPR_STMT PREDECREMENT_EXPR MULT_EXPR IDENTIFIER_NODE

a

INTEGER_CST

7

MODIFY_EXPR EXPR_STMT IDENTIFIER_NODE

b

INTEGER_CST

1

VAR_DECL VAR_DECL

a = (−−b) * 7; x = y+z;

Code optimization in GCC – p.9

slide-39
SLIDE 39

Simple: overview

SIMPLE’s grammar defines an imperative normal form:

Code optimization in GCC – p.10

slide-40
SLIDE 40

Simple: overview

SIMPLE’s grammar defines an imperative normal form: Reduced number of expressions.

Code optimization in GCC – p.10

slide-41
SLIDE 41

Simple: overview

SIMPLE’s grammar defines an imperative normal form: Reduced number of expressions. Reduced number of control structures.

Code optimization in GCC – p.10

slide-42
SLIDE 42

Simple: overview

SIMPLE’s grammar defines an imperative normal form: Reduced number of expressions. Reduced number of control structures. SIMPLE AST has a regular structure.

Code optimization in GCC – p.10

slide-43
SLIDE 43

Simple: overview

SIMPLE’s grammar defines an imperative normal form: Reduced number of expressions. Reduced number of control structures. SIMPLE AST has a regular structure. Systematic AST analysis is possible.

Code optimization in GCC – p.10

slide-44
SLIDE 44

Simple: overview

SIMPLE’s grammar defines an imperative normal form: Reduced number of expressions. Reduced number of control structures. SIMPLE AST has a regular structure. Systematic AST analysis is possible. Common intermediate representation for all front ends.

Code optimization in GCC – p.10

slide-45
SLIDE 45

Simple: exemple

a = −−b*7;

Code optimization in GCC – p.11

slide-46
SLIDE 46

Simple: exemple

a = −−b*7; a=b*7; b=b−1;

Code optimization in GCC – p.11

slide-47
SLIDE 47

Simple: exemple

a = −−b*7; a=b*7; b=b−1; if (i++ && −−k) { } j=f(i+3*k);

Code optimization in GCC – p.11

slide-48
SLIDE 48

Simple: exemple

a = −−b*7; a=b*7; b=b−1; if (i++ && −−k) { } j=f(i+3*k); if (i) { k=k−1; if(k) else i=i+1; { i=i+1; T1=3*k; T2=i+T1; j=f(T2); } i=i+1; } else

Code optimization in GCC – p.11

slide-49
SLIDE 49

Simple: exemple

{ } A[i]=A[i+3*k]; while(i++ && −−k)

Code optimization in GCC – p.12

slide-50
SLIDE 50

Simple: exemple

if(i) { k=k−1; if (k) while(1) { i=i+1; T1=3*k; T2=i+T1; A[i]=A[T2]; if(i) { k=k−1; if(k) i=i+1; else break; } else break; } } i=i+1; { } A[i]=A[i+3*k]; while(i++ && −−k)

Code optimization in GCC – p.12

slide-51
SLIDE 51

An optimizing compiler

Front−end Source code Analyses Optimizations

Code optimization in GCC – p.13

slide-52
SLIDE 52

An optimizing compiler

Front−end Inlining Analyses Source code Call graph Recursivity suppression Optimizations

Code optimization in GCC – p.13

slide-53
SLIDE 53

Call Graph

(node, edge) => (declaration, call)

Code optimization in GCC – p.14

slide-54
SLIDE 54

Call Graph

(node, edge) => (declaration, call) Graph representation:

Code optimization in GCC – p.14

slide-55
SLIDE 55

Call Graph

(node, edge) => (declaration, call) Graph representation: pointers: P-Space.

Code optimization in GCC – p.14

slide-56
SLIDE 56

Call Graph

(node, edge) => (declaration, call) Graph representation: pointers: P-Space. in a file under parenthesized form: EXP-Space.

Code optimization in GCC – p.14

slide-57
SLIDE 57

Call Graph

(node, edge) => (declaration, call) Graph representation: pointers: P-Space. in a file under parenthesized form: EXP-Space. Use metrics for controlling inlining.

Code optimization in GCC – p.14

slide-58
SLIDE 58

Call Graph

(node, edge) => (declaration, call) Graph representation: pointers: P-Space. in a file under parenthesized form: EXP-Space. Use metrics for controlling inlining. GCC’s analysis is limited to a single translation unit.

Code optimization in GCC – p.14

slide-59
SLIDE 59

Call Graph : solution

Perform call graph optimizations outside GCC.

Code optimization in GCC – p.15

slide-60
SLIDE 60

Call Graph : solution

Perform call graph optimizations outside GCC. Problems :

Code optimization in GCC – p.15

slide-61
SLIDE 61

Call Graph : solution

Perform call graph optimizations outside GCC. Problems : Extract information, decide, then apply

  • ptimizations: 3 passes.

Code optimization in GCC – p.15

slide-62
SLIDE 62

Call Graph : solution

Perform call graph optimizations outside GCC. Problems : Extract information, decide, then apply

  • ptimizations: 3 passes.

Knowledge base’s size.

Code optimization in GCC – p.15

slide-63
SLIDE 63

Call Graph : solution

Perform call graph optimizations outside GCC. Problems : Extract information, decide, then apply

  • ptimizations: 3 passes.

Knowledge base’s size. What informations to be stored in KB?

Code optimization in GCC – p.15

slide-64
SLIDE 64

An optimizing compiler

Front−end Inlining Analyses Source code Call graph Recursivity suppression Optimizations

Code optimization in GCC – p.16

slide-65
SLIDE 65

An optimizing compiler

Front−end Inlining Recursivity suppression Call graph Control flow graph CFG normalization Analyses Optimizations Source code

Code optimization in GCC – p.16

slide-66
SLIDE 66

CFG Normalization

Suppress irregularities from control flow: goto, break, continue.

Code optimization in GCC – p.17

slide-67
SLIDE 67

CFG Normalization

Suppress irregularities from control flow: goto, break, continue. CFG normalization is based on Simple.

Code optimization in GCC – p.17

slide-68
SLIDE 68

CFG Normalization

Suppress irregularities from control flow: goto, break, continue. CFG normalization is based on Simple. Why normalizing CFG?

Code optimization in GCC – p.17

slide-69
SLIDE 69

CFG Normalization

Suppress irregularities from control flow: goto, break, continue. CFG normalization is based on Simple. Why normalizing CFG? It is difficult to optimize programs containing gotos.

Code optimization in GCC – p.17

slide-70
SLIDE 70

CFG Normalization

Suppress irregularities from control flow: goto, break, continue. CFG normalization is based on Simple. Why normalizing CFG? It is difficult to optimize programs containing gotos. Break and continue translation to RTL generates gotos.

Code optimization in GCC – p.17

slide-71
SLIDE 71

CFG Normalization

Suppress irregularities from control flow: goto, break, continue. CFG normalization is based on Simple. Why normalizing CFG? It is difficult to optimize programs containing gotos. Break and continue translation to RTL generates gotos. Simplification generates irregular code.

Code optimization in GCC – p.17

slide-72
SLIDE 72

Flow Out

Condition Loop’s body Loop:

Code optimization in GCC – p.18

slide-73
SLIDE 73

Flow Out

if (c) break; Condition Normal exit Irregular exit Loop: Loop’s body

Code optimization in GCC – p.18

slide-74
SLIDE 74

Flow Out

else { } ... if (c) {b_c = true;} Loop’s body Loop: b_c & Condition Normal exit

Code optimization in GCC – p.18

slide-75
SLIDE 75

Break Elimination

while (a) stmt1; { if (b) break; stmt2; }

Code optimization in GCC – p.19

slide-76
SLIDE 76

Break Elimination

int c_b = 0; stmt1; { if (b) {c_b = 1;} else } { } stmt2; while (c_b == 0 && a)

Code optimization in GCC – p.19

slide-77
SLIDE 77

Goto Elimination

goto label

Code optimization in GCC – p.20

slide-78
SLIDE 78

Goto Elimination

goto label

Code optimization in GCC – p.20

slide-79
SLIDE 79

Goto Elimination

goto label

Code optimization in GCC – p.20

slide-80
SLIDE 80

Goto Elimination

goto label

Code optimization in GCC – p.20

slide-81
SLIDE 81

Goto Elimination

goto label

Code optimization in GCC – p.20

slide-82
SLIDE 82

An optimizing compiler

Front−end Inlining Recursivity suppression Call graph Control flow graph CFG normalization Analyses Optimizations Source code

Code optimization in GCC – p.21

slide-83
SLIDE 83

An optimizing compiler

Front−end Inlining Loop unrolling / blocking / fusion ... Recursivity suppression CFG normalization Call graph Control flow graph Optimizations Analyses Source code Spatial / temporal locality

Code optimization in GCC – p.21

slide-84
SLIDE 84

An optimizing compiler

Front−end SSA Inlining Loop unrolling / blocking / fusion ... CFG normalization Spatial / temporal locality Induction variables Array access functions Dependence analysis Pointers and alias analysis Optimizations Analyses Source code Call graph Control flow graph Recursivity suppression

Code optimization in GCC – p.21

slide-85
SLIDE 85

Loop Optimizations

Loops are normalized after detection of induction variables.

Code optimization in GCC – p.22

slide-86
SLIDE 86

Loop Optimizations

Loops are normalized after detection of induction variables. Geometric representation of array accesses can be then constructed.

Code optimization in GCC – p.22

slide-87
SLIDE 87

Loop Optimizations

Loops are normalized after detection of induction variables. Geometric representation of array accesses can be then constructed. Dependence analysis is necessary for validating loop transformations.

Code optimization in GCC – p.22

slide-88
SLIDE 88

Loop Optimizations

Loops are normalized after detection of induction variables. Geometric representation of array accesses can be then constructed. Dependence analysis is necessary for validating loop transformations. These points are still under development.

Code optimization in GCC – p.22

slide-89
SLIDE 89

An optimizing compiler

Front−end SSA Inlining Loop unrolling / blocking / fusion ... CFG normalization Spatial / temporal locality Induction variables Array access functions Dependence analysis Pointers and alias analysis Optimizations Analyses Source code Call graph Control flow graph Recursivity suppression

Code optimization in GCC – p.23

slide-90
SLIDE 90

An optimizing compiler

Front−end SSA Inlining Loop unrolling / blocking / fusion ... Recursivity suppression CFG normalization Spatial / temporal locality Call graph Control flow graph Induction variables Array access functions Pointers and alias analysis Dependence analysis Source code Optimizations Analyses Unparser Optimized code

Code optimization in GCC – p.23

slide-91
SLIDE 91

Remerciements

Merci à tous ceux qui ont contribué à la réussite de ce projet :

Code optimization in GCC – p.24

slide-92
SLIDE 92

Remerciements

Merci à tous ceux qui ont contribué à la réussite de ce projet : l’équipe ICPS pour l’excellente ambiance, Philippe Clauss, Vincent Loechner et Benoît Meister pour leur travail de recherche, Catherine Mongenet pour le cours de compil, Frédéric Wagner et Diego Novillo pour m’avoir accompagné dans ce projet, the FSF for GCC, Debian, Linux and Prosper et ma famille.

Code optimization in GCC – p.24