[LLVMdev] LTO v. opt

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Jan 5 13:16:10 PST 2015


> On 2015-Jan-05, at 01:14, Bill Wendling <isanbard at gmail.com> wrote:
> 
> On Jan 3, 2015, at 11:52 PM, Bill Wendling <isanbard at gmail.com> wrote:
> 
>> On Jan 2, 2015, at 8:32 PM, David Callahan <dcallahan at fb.com> wrote:
>> 
>>> Hi,
>>>  
>>> I am new to the LLVM dev community so forgive a perhaps obvious question. I am looking at bug 17623 which is an LTO/optimizer interaction bug.  I am working on a Mac with Xcode installed but have also built the 3.6 LLVM binaries (from a few month old local branch).
>>>  
>>> The default version of “ld” from Apple supports an option “-save-temps” which I believe saves bitcode both before and after the optimizer (and the bug is visible as a difference between these two)
>>>  
>>> ~/llvm-install/bin/clang -flto -O2 -c -o bug17623.o bug17623.c
>>> "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.10.0 -lSystem /Users/dcallahan/llvm-install/bin/..\
>>> /lib/clang/3.6.0/lib/darwin/libclang_rt.osx.a -save-temps -o bug36 bug17623.o
>>>  
>>> (this produces bug36.lto.bc and bug36.lto.opt.bc)
>>>  
>>> However, if I use “opt” to try and duplicate the actions run by “ld”, as in:
>>>  
>>> ~/llvm-install/bin/opt -O2 -o bug36.opt.bc bug36.lto.bc
>>>  
>>> This generates a different (much cleaner and correct!) output.
>>>  
>>> So my questions are:
>>> 1.     Is it feasible to get “opt” to reproduce the behavior of “ld”?
>> 
>> The optimizations that occur during LTO (the ‘ld’ command) are different from the “normal” optimizations that opt runs. For one, LLVM has a view of the whole program, not just one compilation unit at a time. If you want to look at some of the optimizations that it performs, you can use the “opt -std-link-opts” command.
>> 
>>> 2.     Assuming I am just missing some parameters to “opt”, how do I determine what they should be?
>> 
>> The link time optimizations are enabled via the "-std-link-opts” option.
>> 

You might also need to add `-internalize-public-api-list` to prevent
functions like `main()` from getting internalized (and dead-stripped).

> I forgot to mention that you will need to link all of the .bc files together using 'llvm-link’ before you run ‘opt -std-link-opts’ on it.

(If you're starting from bug36.lto.bc then they've already been linked.)



More information about the llvm-dev mailing list