[llvm-dev] Relationship between clang, opt and llc

Peizhao Ou via llvm-dev llvm-dev at lists.llvm.org
Mon Apr 10 16:57:46 PDT 2017

Hi folks,

I am wondering about the relationship clang, opt and llc. I understand that
this has been asked, e.g.,
Sorry for posting a similar question again, but I still have something that
hasn't been resolved yet.

More specifically I am wondering about the following two approaches
compiling optimized executable:

1. clang -O3 -c source.c -o source.o
    clang a.o b.o c.o ... -o executable

2. clang -O0 -c -emit-llvm -o source.bc
    opt -O3 source.bc -o source.bc
    llc -O3 -filetype=obj source.bc -o source.o
    clang a.o b.o c.o ... -o executable

I took a look at the source code of the clang tool and the opt tool, they
both seem to use the PassManagerBuilder::populateModulePassManager() and
PassManagerBuilder::populateFunctionPassManager() functions to add passes
to their optimization pipeline; and for the backend, the clang and llc both
use the addPassesToEmitFile() function to generate object code.

So presumably the above two approaches to generating optimized executable
file should do the same thing. However, I am seeing that the second
approach is around 2% slower than the first approach (which is the way
developers usually use) pretty consistently.

Can anyone point me to the reasons why this happens? Or even correct my
wrong understanding of the relationship between these two approaches?

PS: I used the -debug-pass=Structure option to print out the passes, they
seem the same except that the first approach has an extra pass called
"-add-discriminator", but I don't think that's the reason.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/06a0fbcb/attachment.html>

More information about the llvm-dev mailing list