ARM > Efficient C for ARM > Hoisting

by David Thomas on

Hoisting

Constant expressions inside a loop can be hoisted to outside of the loop.

  • That way the code costs just once, rather than on every loop iteration.
  • Keeps code out of the way – denser code.

Examples

Doing the same test repeatedly in a loop:

txt->flags |= METRICS; /* for example */

for (i = 0; i < N; i++) { if (txt->flags & TRANSLATE) translate(i); else if (txt->flags & METRICS) get_metrics(i); else draw(i); }

We hoist out the loop:

if (txt->flags & TRANSLATE)
{
  for (i = 0; i < N; i++)
    translate(i);
}
else if (txt->flags & METRICS)
{
  for (i = 0; i < N; i++)
    get_metrics(i);
}
else
{
  for (i = 0; i < N; i++)
    draw(i);
}