📝Loop unswitching must pay attention to possibly zero-counted loops (in presence of uninitialized values)

top
Loop unswitching
source
Chisnall2018

Consider the following example:

int i, j, w, x[1000], y[1000];
for (i = 0; i < j; i++) {
  x[i] += y[i];
  if (w)
    y[i] = 0;
 }
int i, j, w, x[1000], y[1000];
if (w) {
  for (i = 0; i < j; i++) {
    x[i] += y[i];
    y[i] = 0;
  }
 } else {
  for (i = 0; i < j; i++) {
    x[i] += y[i];
  }
 }

Because j might be 0, the original loop might execute 0 times and never access w (which might be uninitialized). The “optimized” version always accesses w, and thus is invalid optimization.

This is not an issue for languages that do not allow uninitialized values.

Backlinks

Want to receive my 🖋 posts as I publish them?