question about loop unrolling

test.cpp:

int main() {

int ret = 0;

for (int i = 0; i < 100; i++) {

ret += i;

}

return ret;

}

Hi,

I’m new to clang/llvm recently and interested in doing some stuff in optimization passes.

I tried to play above simple test with clang and see if I could get expected llvm IR by enabling llvm loop unrolling of a count 2.

Here are my attempts:

  1. adding pragma before loop in test.cpp: #pragma clang loop unroll_count(2)

It did not unroll the loop.

  1. clang++ -c -emit-llvm -S -std=c++11 test.cpp

opt test.ll -mem2reg -loop-unroll -unroll-count=2 -unroll-allow-partial -S

It did not unroll the loop.

In addition, by enabling -debug, I saw message “Skipping ‘Unroll Loops’ pass……”

  1. clang++ -c -emit-llvm -S -std=c++11 -O1 test.cpp

It unrolled the loop completely and directly return the final result(4950).

I assume that my llvm and clang are latest and installed correctly.

Could someone please let me know what I am missing here?

Thanks,

Kai

It may be that clang added the optnone attribute to main when you built it in (b): https://godbolt.org/g/WhM1UA . optnone, as the name implies, requests that optimizations are skipped for a given function. If this is the case, removing the optnone might make (b) do what you want.

For (c), I’d introduce something that may have side-effects, so LLVM can’t easily model+eliminate the entire loop. Examples of this being an external function call (https://godbolt.org/g/toqR6b) or making your int volatile (https://godbolt.org/g/4svW7F).

George