Code optimization in GCC
S´ ebastian Pop Universit´ e Louis Pasteur Strasbourg FRANCE
Code optimization in GCC – p.1
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
S´ ebastian Pop Universit´ e Louis Pasteur Strasbourg FRANCE
Code optimization in GCC – p.1
Code optimization in GCC – p.2
Code optimization in GCC – p.2
Code optimization in GCC – p.2
Code optimization in GCC – p.2
Code optimization in GCC – p.2
GCC
Code optimization in GCC – p.3
gcc g++ gcj g77
Front−ends
GCC
Code optimization in GCC – p.3
gcc g++ gcj g77
Front−ends
i386 ia64 m68k sparc
Machine Description
GCC
Code optimization in GCC – p.3
gcc g++ gcj g77
Front−ends
i386 ia64 m68k sparc
Machine Description
RTL
Back−end
GCC
Code optimization in GCC – p.3
gcc g++ gcj g77
Front−ends
i386 ia64 m68k sparc
Machine Description
RTL
Back−end
GCC
GAS Assembler
Code optimization in GCC – p.3
Code optimization in GCC – p.4
Code optimization in GCC – p.4
Code optimization in GCC – p.4
../gcc/configure -target=sparc -build=i586
Code optimization in GCC – p.4
gcc g++ gcj g77
Front−ends
i386 ia64 m68k sparc
Machine Description
RTL
Back−end
GCC
GAS Assembler
Code optimization in GCC – p.5
gcc g++ gcj g77
Front−ends
RTL
Back−end
GCC
sparc
Machine Description
description SPARC specific
Code optimization in GCC – p.5
gcc g++ gcj g77
Front−ends
RTL
Back−end
GCC
sparc
Machine Description
SPARC specific SPARC assembler code description
Code optimization in GCC – p.5
Code optimization in GCC – p.6
Code optimization in GCC – p.6
Memory accesses are under their canonical form: <start adress + offset>
Code optimization in GCC – p.6
Memory accesses are under their canonical form: <start adress + offset>
Code optimization in GCC – p.6
Memory accesses are under their canonical form: <start adress + offset>
Code optimization in GCC – p.6
Memory accesses are under their canonical form: <start adress + offset>
Code optimization in GCC – p.6
GCC
RTL
gcc g++ gcj g77 Machine description Translation follows machines specificities
Code optimization in GCC – p.7
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
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
Code optimization in GCC – p.8
TREE_CODE, ...
Code optimization in GCC – p.8
TREE_CODE, ...
Code optimization in GCC – p.8
TREE_CODE, ...
allows tree-checking during development.
Code optimization in GCC – p.8
a = (−−b) * 7; x = y+z;
Code optimization in GCC – p.9
EXPR_STMT
a = (−−b) * 7; x = y+z; a = (−−b) * 7;
Code optimization in GCC – p.9
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
EXPR_STMT MODIFY_EXPR EXPR_STMT
a = (−−b) * 7; x = y+z; EXPR_STMT_EXPR (S)
Code optimization in GCC – p.9
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
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
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
Code optimization in GCC – p.10
Code optimization in GCC – p.10
Code optimization in GCC – p.10
Code optimization in GCC – p.10
Code optimization in GCC – p.10
Code optimization in GCC – p.10
a = −−b*7;
Code optimization in GCC – p.11
a = −−b*7; a=b*7; b=b−1;
Code optimization in GCC – p.11
a = −−b*7; a=b*7; b=b−1; if (i++ && −−k) { } j=f(i+3*k);
Code optimization in GCC – p.11
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
{ } A[i]=A[i+3*k]; while(i++ && −−k)
Code optimization in GCC – p.12
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
Front−end Source code Analyses Optimizations
Code optimization in GCC – p.13
Front−end Inlining Analyses Source code Call graph Recursivity suppression Optimizations
Code optimization in GCC – p.13
Code optimization in GCC – p.14
Code optimization in GCC – p.14
Code optimization in GCC – p.14
Code optimization in GCC – p.14
Code optimization in GCC – p.14
Code optimization in GCC – p.14
Code optimization in GCC – p.15
Code optimization in GCC – p.15
Code optimization in GCC – p.15
Code optimization in GCC – p.15
Code optimization in GCC – p.15
Front−end Inlining Analyses Source code Call graph Recursivity suppression Optimizations
Code optimization in GCC – p.16
Front−end Inlining Recursivity suppression Call graph Control flow graph CFG normalization Analyses Optimizations Source code
Code optimization in GCC – p.16
Code optimization in GCC – p.17
Code optimization in GCC – p.17
Code optimization in GCC – p.17
Code optimization in GCC – p.17
Code optimization in GCC – p.17
Code optimization in GCC – p.17
Code optimization in GCC – p.18
Code optimization in GCC – p.18
Code optimization in GCC – p.18
Code optimization in GCC – p.19
Code optimization in GCC – p.19
goto label
Code optimization in GCC – p.20
goto label
Code optimization in GCC – p.20
goto label
Code optimization in GCC – p.20
goto label
Code optimization in GCC – p.20
goto label
Code optimization in GCC – p.20
Front−end Inlining Recursivity suppression Call graph Control flow graph CFG normalization Analyses Optimizations Source code
Code optimization in GCC – p.21
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
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
Code optimization in GCC – p.22
Code optimization in GCC – p.22
Code optimization in GCC – p.22
Code optimization in GCC – p.22
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
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
Code optimization in GCC – p.24
Code optimization in GCC – p.24