In computer science, an induction variable is a variable that gets increased or decreased by a fixed amount on every iteration of a loop or is a linear function of another induction variable.[1]

For example, in the following loop, i and j are induction variables:

for (i = 0; i < 10; ++i) {
    j = 17 * i;
}

Application to strength reduction

edit

A common compiler optimization is to recognize the existence of induction variables and replace them with simpler computations; for example, the code above could be rewritten by the compiler as follows, on the assumption that the addition of a constant will be cheaper than a multiplication.

j = -17;

for (i = 0; i < 10; ++i) {
    j = j + 17;
}

This optimization is a special case of strength reduction.

Application to reduce register pressure

edit

In some cases, it is possible to reverse this optimization in order to remove an induction variable from the code entirely. For example:

extern int sum;

int foo(int n) {
    int j = 5;

    for (int i = 0; i < n; ++i) {
        j += 2;
        sum += j;
    }

    return sum;
}

This function's loop has two induction variables: i and j. Either one can be rewritten as a linear function of the other; therefore, the compiler may optimize this code as if it had been written

extern int sum;

int foo(int n) {
    for (int i = 0; i < n; ++i) {
        sum += 5 + 2 * (i + 1);
    }

    return sum;
}

Induction variable substitution

edit

Induction variable substitution is a compiler transformation to recognize variables which can be expressed as functions of the indices of enclosing loops and replace them with expressions involving loop indices.

This transformation makes the relationship between the variables and loop indices explicit, which helps other compiler analysis, such as dependence analysis.

Example:

Input code:

int c = 10;

for (int i = 0; i < 10; i++) {
    c = c + 5; // c is incremented by 5 for each loop iteration
}

Output code

int c = 10;

for (int i = 0; i < 10; i++) {
    c = 10 + 5 * (i + 1);  // c is explicitly expressed as a function of loop index
}

Non-linear induction variables

edit

The same optimizations can be applied to induction variables that are not necessarily linear functions of the loop counter; for example, the loop

j = 1;

for (i = 0; i < 10; ++i) {
    j = j << 1;
}

may be converted to

for (i = 0; i < 10; ++i) {
    j = 1 << (i+1);
}

See also

edit

References

edit
  1. ^ Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2. induction variable.

Further reading

edit

📚 Artikel Terkait di Wikipedia

Vbcc

propagation dead code elimination alias analysis loop unrolling induction variable elimination loop-invariant code motion loop reversal Sunitha, K.V.N. (2013)

Loop-invariant code motion

the two multiplications inside the loop (6*i and a[i]), and induction variable elimination could then elide i completely. Since 6 * i must be in lock step

Inductive reasoning

degree of probability. Unlike deductive reasoning (such as mathematical induction), where the conclusion is certain, given the premises are correct, inductive

Variable-frequency drive

A variable-frequency drive (VFD, or adjustable-frequency drive, adjustable-speed drive, variable-speed drive, AC drive, micro drive, inverter drive, variable

Enabling transformation

intraprocedural optimizations such as dead code elimination, loop-invariant code motion, and induction variable elimination can take advantage of information from

Inline expansion

site. This in turn may enable dead code elimination, loop-invariant code motion, or induction variable elimination. In the C example in the prior section

Electric motor

Squirrel-cage induction motor SRM – Switched reluctance motor SyRM – Synchronous reluctance motor VFD – Variable-frequency drive WRIM – Wound-rotor induction motor

Turbocharger

turbocharger (also known as a turbo or a turbosupercharger) is a forced induction device that compresses the intake air, forcing more air into the engine