Which optimization pass deals with heap values?

All the optimization passes I can find in the documentation, deal with register, stack or global values; I cannot find any mention of anything trying to optimize values on the heap. But this:

#include <stdlib.h>

int main(int argc, char **argv) {
int *a = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++)
a[i] = i;
return a[5];
}

compiles to ‘ret 5’ (as it should). Which pass does that?

Hi,

The optimization should be done at InstructionCombine pass. See: Compiler Explorer. Previous cleaning passes are necessary.

But I feel this optimization is a little bit aggresive. Since it changes the behavior of the program. The program above might hit a memory leak while the optimized one would not.

As a reference, GCC wouldn’t do this under O2: Compiler Explorer. It would only do this under O3.

Thanks,
Chuanqi

You can use -mllvm -print-changed with clang when built with assertions to find this out, e.g. see https://clang.godbolt.org/z/aM18Tr7Mr

It will be multiple optimizations working together. There are several passes that optimize memory operation, like DSE, GVN, EarlyCSE +MemorySSA.

Thanks! Yeah, looking over the detailed output, it looks like the most important step was global value numbering, of which it is said

This pass performs global value numbering to eliminate fully and partially redundant instructions. It also performs redundant load elimination.

So yeah, it did indeed eliminate the redundant load.