[LLVMdev] How to use LLVM optimizations with clang

Duncan Sands baldrick at free.fr
Fri Jun 8 10:23:36 PDT 2012


Hi,

> If I compile the program using the following command line i.e.
>
> $ clang -O3 -lm *.c

this may be doing link time optimization.

>
> then
>
> $ time ./a.out
>
> real    0m2.606s
> user    0m2.584s
> sys     0m0.012s
>
> BUT, if I use all the optimizations enabled with -O3 but specify them
> explicity i.e.

you can just use "opt -O3" here.

>
> for F in *.c ; do B=`basename $F .c` ; gcc
> -fplugin=/damm/compilers/dragonegg-3.1.src/dragonegg.so -S -o - $F
> -fplugin-arg-dragonegg-emit-ir | opt -targetlibinfo -no-aa -tbaa
> -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg
> -basiccg -prune-eh -inline -functionattrs -argpromotion
> -scalarrepl-ssa -domtree -early-cse -simplify-libcalls
> -lazy-value-info -jump-threading -correlated-propagation -simplifycfg
> -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops
> -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch
> -instcombine -scalar-evolution -loop-simplify -lcssa -indvars
> -loop-idiom -loop-deletion -loop-unroll -memdep -gvn -memdep
> -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading
> -correlated-propagation -domtree -memdep -dse -adce -simplifycfg
> -instcombine -strip-dead-prototypes -globaldce -constmerge -preverify
> -domtree -verify -o $B.ll ; done
>
> $ clang *.ll

Try clang -O3 *.ll

If it makes a difference then that means that clang is linking all these files
together to form one mega file which it is then optimizing.

Ciao, Duncan.

>
> then
>
> time ./a.out
>
> real    0m7.791s
> user    0m7.760s
> sys     0m0.008s
>
> Am I missing something here?
>
> Though directly compiling files i.e.
>
> $ clang *.c
>
> results in
>
> time ./a.out
>
> real    0m10.167s
> user    0m10.121s
> sys     0m0.016s
>
> Regards
>
> Shahzad
>
> On Fri, Jun 8, 2012 at 7:00 PM, Duncan Sands<baldrick at free.fr>  wrote:
>> Hi,
>>
>>
>>> I tried it with -o - but its producing an error
>>>
>>> gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
>>>
>>> What you suggest?
>>
>>
>> what I wrote:
>>
>>>>   for F in *.c ; do B=`basename $F .c` ; gcc
>>>> -fplugin=/path/to/dragonegg.so
>>>> -S -o - $F -fplugin-arg-dragonegg-emit-ir | opt -adce -o $B.ll ; done
>>>>   clang *.ll
>>
>>
>> Thanks to the for loop and passing $F to gcc, you are no longer using gcc
>> with
>> multiple files.  So if you are getting that message then you are don't what
>> I
>> suggested.
>>
>> Ciao, Duncan.
>>
>>
>>>>
>>>> Ciao, Duncan.
>>>>
>>>>
>>>>>
>>>>> $ clang *.s
>>>>>
>>>>> Regards
>>>>>
>>>>> Shahzad
>>>>>
>>>>> On Fri, Jun 8, 2012 at 9:10 AM, Duncan Sands<baldrick at free.fr>      wrote:
>>>>>>
>>>>>>
>>>>>> Hi Shahzad,
>>>>>>
>>>>>>
>>>>>>> Is it possible that we can use LLVM optimization beside O1, O2, O3
>>>>>>> along with dragonegg plugin?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> sure, try this:
>>>>>>
>>>>>>   gcc -fplugin=path/dragonegg.so ...other_options_here... -S -o -
>>>>>> -fplugin-arg-dragonegg-emit-ir
>>>>>> -fplugin-arg-dragonegg-llvm-ir-optimize=0
>>>>>> |
>>>>>> opt -pass1 -pass2 ...
>>>>>>
>>>>>> Here -fplugin-arg-dragonegg-emit-ir tells it to output LLVM IR rather
>>>>>> than
>>>>>> target assembler.  You can also use -flto here.
>>>>>>
>>>>>> -fplugin-arg-dragonegg-llvm-ir-optimize=0 disables the standard set of
>>>>>> LLVM
>>>>>> optimizations.
>>>>>>
>>>>>> In general, if a front-end can produce LLVM IR then you can do this, by
>>>>>> outputting the IR and passing it to "opt".
>>>>>>
>>>>>> Ciao, Duncan.
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Regards
>>>>>>>
>>>>>>> Shahzad
>>>>>>>
>>>>>>> On Thu, Jun 7, 2012 at 10:59 PM, Abdul Wahid Memon
>>>>>>> <engrwahidmemon at gmail.com>        wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks alot Chad for these quick and fine responses.
>>>>>>>>
>>>>>>>> Regards
>>>>>>>>
>>>>>>>> Abdul
>>>>>>>>
>>>>>>>> On Thu, Jun 7, 2012 at 10:57 PM, Chad Rosier<mcrosier at apple.com>
>>>>>>>>   wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Jun 7, 2012, at 1:53 PM, Abdul Wahid Memon wrote:
>>>>>>>>>
>>>>>>>>>> Thanks again chad. One more question please.
>>>>>>>>>>
>>>>>>>>>> Is it possible that I can use these optimization using dragonegg
>>>>>>>>>> plugin
>>>>>>>>>> somehow?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I haven't a clue.  Maybe Duncan can answer that?
>>>>>>>>>
>>>>>>>>>   Chad
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>>
>>>>>>>>>> Shahzad
>>>>>>>>>>
>>>>>>>>>> On Thu, Jun 7, 2012 at 10:51 PM, Chad Rosier<mcrosier at apple.com>
>>>>>>>>>>   wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Jun 7, 2012, at 1:48 PM, Abdul Wahid Memon wrote:
>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Jun 7, 2012 at 10:44 PM, Chad Rosier<mcrosier at apple.com>
>>>>>>>>>>>>   wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Jun 7, 2012, at 1:39 PM, Abdul Wahid Memon wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks alot Chad for quick response. Does this means that, we
>>>>>>>>>>>>>> can
>>>>>>>>>>>>>> not
>>>>>>>>>>>>>> use LLVM optimizations except O1, O2, O3, O4 and unroll-loops
>>>>>>>>>>>>>> with
>>>>>>>>>>>>>> clang?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Try using the -debug-pass=Arguments options to see what passes
>>>>>>>>>>>>> are
>>>>>>>>>>>>> being run at each optimization level.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Yes, I have seen those optimization but I want to disable all the
>>>>>>>>>>>> default optimization (-O0) and specify them individually to test
>>>>>>>>>>>> their
>>>>>>>>>>>> effect.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 1. Generate the bitcode/ir with -O0
>>>>>>>>>>> 2. Run opt with the optimization in question.  You should be able
>>>>>>>>>>> to
>>>>>>>>>>> specify most any pass with opt.
>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> E.g.,
>>>>>>>>>>>>> clang -O[0-3] -mllvm -debug-pass=Arguments foo.c.
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> One more thing I would like to know that If I want to process
>>>>>>>>>>>>>> multiple
>>>>>>>>>>>>>> modules with opt at the same time like
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> opt -adce *.bc
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> I don't think this will work.
>>>>>>>>>>>>>
>>>>>>>>>>>> ok.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> then how is it possible with opt in one go, if I process all
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> bytecode files within Makefile.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> You should be able to define a rule in the Makefile to compile
>>>>>>>>>>>>> your
>>>>>>>>>>>>> bitcode/IR files.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ok. I got the point.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks alot
>>>>>>>>>>>>
>>>>>>>>>>>> Shahzad
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>   Chad
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Shahzad
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Thu, Jun 7, 2012 at 9:22 PM, Chad Rosier<mcrosier at apple.com>
>>>>>>>>>>>>>>   wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Jun 7, 2012, at 10:59 AM, Abdul Wahid Memon wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hello everyone
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I am trying to use some LLVM optimizations like -die or
>>>>>>>>>>>>>>>> -adce.
>>>>>>>>>>>>>>>> Is
>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>> possible to use them along clang?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Or is there a way where these optimization can be passed on
>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> "opt"
>>>>>>>>>>>>>>>> tool through clang, if opt is being used by clang behind the
>>>>>>>>>>>>>>>> scenes?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> No, opt only works on llvm IR/bitcode.  You can generate it
>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>> this:
>>>>>>>>>>>>>>> clang -c foo.c -emit-llvm -o foo.bc
>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>> clang -S foo.c -emit-llvm -o foo.ll
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Then you can run the optimization(s):
>>>>>>>>>>>>>>> opt -adce foo.bc -o foo-adce.bc
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Then you can compile using clang
>>>>>>>>>>>>>>> clang -c foo-adce.bc -o foo-adce.o
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>   Chad
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks alot
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Regards
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Shahzad
>>>>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>>>>> LLVM Developers mailing list
>>>>>>>>>>>>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>>>>>>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>
>>>>
>>




More information about the llvm-dev mailing list