understanding the opt tool

Hello,

I am trying to understand the opt tool. I wrote a program and created the .bc file using clang. And I used this .bc file to generate another .bc file using the opt tool. I dis-assembled this bitcode file and compared the output with previous unoptimized bitcode file. It was the same. I am not sure how to check the difference. Can anyone tell me if this is how we check the optimized output or is there any other way. If the procedure that I used is correct then could you tell me why am I not able to see the optimizations on the source code. The commands are in this way:

clang -c -emit-llvm filename.c -o filename.bc

opt -strip-dead-prototypes -f <filename.bc> filename2.bc

I am working on the visual studio solution file and on windows 7 (in case you want to know the platform)

Thanks.

Hi Kalyan,

opt -strip-dead-prototypes -f <filename.bc> filename2.bc

you have to specify the list of passes to run. -strip-dead-prototypes
only removes unused declarations. If there are none, it will do nothing.
Try:
   opt -std-compile-opts -f <filename.bc> filename2.bc

Ciao,

Duncan.

Hello Kalyan,

There is one more thing you should know: Clang has maximum optimization turned on by default. You need to specify -O0 to turn it off if you want to see what opt does without clang running all of the optimizations first.

--Sam

From: Duncan Sands <baldrick@free.fr>
To: llvmdev@cs.uiuc.edu
Sent: Sat, April 17, 2010 2:00:00 AM
Subject: Re: [LLVMdev] understanding the opt tool

Hi Kalyan,

opt -strip-dead-prototypes -f <filename.bc>
filename2.bc

you have to specify the list of passes to run.

-strip-dead-prototypes

only removes unused declarations. If there are

none, it will do nothing.

Try:
   opt -std-compile-opts -f

<filename.bc>
filename2.bc

Ciao,

Duncan.

Thanks duncan and samuel. I guess the optimization about striping dead prototypes was not working because of “no dead prototypes” to strip. The -std-compile-opts option works. I can see a change. And @samuel, I tried the clang’s -o0 optimization level compiling, but I could not find any difference with or without that switch in the bitcode file generated. I used this command:

clang filename.c -o0 -emit-llvm

Is this the correct way to use it? If yes then i guess clang does not optimize the source by default.

And one more thing,
When I try a loop optimization on a program like the following, I can’t see any optimizations performed on the code,

int main()
{
int A[10], B[10];
int i;

for(i=0; i<10; i++)
{
A[i] = 1+ i;
}
for (i=0; i<10 ; i++)
{
B[i] = A[i] +1;
printf("\n %d is B[%d] ", B[i] , i);
}
return 0;
}

The commands that I used to do the opts are:
clang -c -emit-llvm filename.c -o filename.bc

opt -loop-unroll -f <filename.bc> filename2.bc

This does not give me any different output when compared to no optimizations. I mean filename.bc and filename2.bc are the same.
Is my program wrong when it comes to a loop optimization or is the procedure to perform the optimization wrong. ?

Thanks.

kalyan ponnala <ponnala.kalyan@gmail.com> writes:

[snip]

And @samuel, I tried the clang's -o0 optimization level compiling, but
I could not find any difference with or without that switch in the
bitcode file generated. I used this command:

clang filename.c -o0 -emit-llvm

Is this the correct way to use it?

It's -O0 (capital 'o')

[snip]

Loop unrolling isn't possible until other optimizations have been performed first.

Dan