[llvm-dev] Relationship between clang, opt and llc (original) (raw)
Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Mon Apr 10 17:21:07 PDT 2017
- Previous message: [llvm-dev] Relationship between clang, opt and llc
- Next message: [llvm-dev] Relationship between clang, opt and llc
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
clang -O0 does not disable all optimization passes modify the IR.; In fact it causes most functions to get tagged with noinline to prevent inlinining
What you really need to do is
clang -O3 -c emit-llvm -o source.bc -v
Find the -cc1 command line from that output. Execute that command with --disable-llvm-passes. leave the -O3 and everything else.
You should be able to feed the output from that command to opt/llc and get consistent results.
~Craig
On Mon, Apr 10, 2017 at 4:57 PM, Peizhao Ou via llvm-dev < llvm-dev at lists.llvm.org> wrote:
Hi folks,
I am wondering about the relationship clang, opt and llc. I understand that this has been asked, e.g., http://stackoverflow. com/questions/40350990/relationship-between-clang-opt-llc-and-llvm-linker. 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. Peizhao
LLVM Developers mailing list llvm-dev at lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/2ab7167a/attachment.html>
- Previous message: [llvm-dev] Relationship between clang, opt and llc
- Next message: [llvm-dev] Relationship between clang, opt and llc
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]