Difference between revisions of "Optimization Topics"

From Wiki**3

(Strength Reduction)
Line 21: Line 21:
  
 
Direct evaluation of expressions using only literal and known values:
 
Direct evaluation of expressions using only literal and known values:
<c>
+
<source lang="c">
 
  int *x = (int *)malloc(1024 * 4);
 
  int *x = (int *)malloc(1024 * 4);
 
  int  y = 3;
 
  int  y = 3;
Line 32: Line 32:
 
  int  y = 3;
 
  int  y = 3;
 
  int  z = 70;
 
  int  z = 70;
</c>
+
</source>
  
 
== Elimination of Common Subexpressions ==
 
== Elimination of Common Subexpressions ==
  
 
Using temporary variables to store common results:
 
Using temporary variables to store common results:
<c>
+
<source lang="c">
 
   d = c * (a + b)
 
   d = c * (a + b)
 
   e = (a + b) / 2
 
   e = (a + b) / 2
</c>
+
</source>
  
 
Becomes:
 
Becomes:
<c>
+
<source lang="c">
 
   t = a + b
 
   t = a + b
 
   d = c * t
 
   d = c * t
 
   e = t / 2
 
   e = t / 2
</c>
+
</source>
  
 
== Cycles / Loops ==
 
== Cycles / Loops ==
  
 
=== Loop unrolling ===
 
=== Loop unrolling ===
<c>
+
<source lang="c">
 
   for (i = 1; i < n; i++)
 
   for (i = 1; i < n; i++)
 
     a[i] = b[i] + 10;
 
     a[i] = b[i] + 10;
</c>
+
</source>
  
 
Becomes:
 
Becomes:
<c>
+
<source lang="c">
 
   for (i = 1; i < (n/4)*4; i+=4) {
 
   for (i = 1; i < (n/4)*4; i+=4) {
 
     a[i]  = b[i]  + 10;
 
     a[i]  = b[i]  + 10;
Line 69: Line 69:
 
   for (; i < n; i++)
 
   for (; i < n; i++)
 
     a[i] = b[i] + 10;
 
     a[i] = b[i] + 10;
</c>
+
</source>
  
 
=== Moving invariant code ===
 
=== Moving invariant code ===
<c>
+
<source lang="c">
 
   for (i = 1; i < n; i++) {
 
   for (i = 1; i < n; i++) {
 
     a[i] = b[i] + c * d;
 
     a[i] = b[i] + c * d;
 
     e = g[k];
 
     e = g[k];
 
   }
 
   }
</c>
+
</source>
  
 
Becomes:
 
Becomes:
<c>
+
<source lang="c">
 
   t = c * d;
 
   t = c * d;
 
   for (i = 1; i < n; i++) {
 
   for (i = 1; i < n; i++) {
Line 86: Line 86:
 
   }
 
   }
 
   e = g[k];
 
   e = g[k];
</c>
+
</source>
  
 
=== Variable induction ===
 
=== Variable induction ===
<c>
+
<source lang="c">
 
   for (i = 1; i < n; i++)
 
   for (i = 1; i < n; i++)
 
     k = i * 4 + m;
 
     k = i * 4 + m;
</c>
+
</source>
  
 
Becomes:
 
Becomes:
<c>
+
<source lang="c">
 
   k = m;
 
   k = m;
 
   for (i = 1; i < n; i++)
 
   for (i = 1; i < n; i++)
 
     k = k + 4;
 
     k = k + 4;
</c>
+
</source>
  
 
=== Other ===
 
=== Other ===
Line 106: Line 106:
  
 
== Algebraic Simplification ==
 
== Algebraic Simplification ==
<asm>
+
<source lang="asm">
 
  xor eax,eax
 
  xor eax,eax
</asm>
+
</source>
  
 
instead of  
 
instead of  
<asm>
+
<source lang="asm">
 
  mov 0,eax
 
  mov 0,eax
</asm>
+
</source>
  
 
== Strength Reduction ==
 
== Strength Reduction ==
<c>
+
<source lang="c">
 
  x << 2 + x
 
  x << 2 + x
</c>
+
</source>
  
 
instead of  
 
instead of  
<c>
+
<source lang="c">
 
  x * 5
 
  x * 5
</c>
+
</source>
  
 
== Instruction Reordering ==
 
== Instruction Reordering ==

Revision as of 13:51, 12 February 2019

Compiladores
Introdução ao Desenvolvimento de Compiladores
Aspectos Teóricos de Análise Lexical
A Ferramenta Flex
Introdução à Sintaxe
Análise Sintáctica Descendente
Gramáticas Atributivas
A Ferramenta YACC
Análise Sintáctica Ascendente
Análise Semântica
Geração de Código
Tópicos de Optimização

Basic Blocks

Instruction sequence where control flow starts at the first instruction and ends at the last, without jumps (except at the last instruction).

Transformations in a basic block maintain the block semantics (considered as an atomic entity).

Optimization Levels

  • User - algorithm- and application-level optimizations
  • Generic - considers intermediate code (processor-independent)
  • Peephole - window over a series of consecutive instructions
  • Local - optimization within a basic block
  • Inter-block (information flow between blocks, mainly cycles)
  • Global - multiple jumps (jumps to jumps, jumps to the next instruction)

Machine-independent optimizations

Constant folding

Direct evaluation of expressions using only literal and known values:

 int *x = (int *)malloc(1024 * 4);
 int  y = 3;
 int  z = 20 * y + 10;
</c>

Becomes:
<c>
 int *x = (int *)malloc(4096);
 int  y = 3;
 int  z = 70;

Elimination of Common Subexpressions

Using temporary variables to store common results:

  d = c * (a + b)
  e = (a + b) / 2

Becomes:

  t = a + b
  d = c * t
  e = t / 2

Cycles / Loops

Loop unrolling

  for (i = 1; i < n; i++)
    a[i] = b[i] + 10;

Becomes:

  for (i = 1; i < (n/4)*4; i+=4) {
    a[i]   = b[i]   + 10;
    a[i+1] = b[i+1] + 10;
    a[i+2] = b[i+2] + 10;
    a[i+3] = b[i+3] + 10;
  }
 
  // rest of the cycle
  for (; i < n; i++)
    a[i] = b[i] + 10;

Moving invariant code

  for (i = 1; i < n; i++) {
    a[i] = b[i] + c * d;
    e = g[k];
  }

Becomes:

  t = c * d;
  for (i = 1; i < n; i++) {
    a[i] = b[i] + t;
  }
  e = g[k];

Variable induction

  for (i = 1; i < n; i++)
    k = i * 4 + m;

Becomes:

  k = m;
  for (i = 1; i < n; i++)
    k = k + 4;

Other

Machine-dependent Optimizations

Algebraic Simplification

 xor eax,eax

instead of

 mov 0,eax

Strength Reduction

 x << 2 + x

instead of

 x * 5

Instruction Reordering

Reorder independent instructions in order to avoid register spilling.

Other

Exercises