[LLVMdev] Does the gcc frontend do inlining or deadcode elimination ?
Long Fei
lfei at ecn.purdue.edu
Tue Jul 12 21:17:30 PDT 2005
Chris,
I tried what you said in last email. It didn't work as expected.
[197.parser]$ llvm-gcc analyze-linkage.c and.c build-disjuncts.c
extract-links.c fast-match.c idiom.c main.c massage.c parse.c
post-process.c print.c prune.c read-dict.c utilities.c xalloc.c
word-file.c strncasecmp.c -lm -W[al],-disable-inlining -o llvm_parser
[hash inlined] [table_pointer inlined] ...
[197.parser]$ opt -inline -inline-threshold=200 < llvm_parser.bc | llc
-march=c > parser_inline.c
<no message here>
The "[xxx inlined]" message is generated from instrumentation in
getInlineCost() (I changed it a little bit so it returns 0 if the callee
is in a list of must-inline functions, it spits out this message in this
case). It seems that getInlineCost() is evaluated only in llvm-gcc (even
when -disable-inlining flag is set) but not in opt -inline. [If you
disable inlining by returning a very large cost, it might explain.]
I will send another email with the .bc file directly to your email
address (in order to get around the mailing-list manager).
thanks,
--Long
Chris Lattner wrote:
> On Mon, 11 Jul 2005, Long Fei wrote:
>
>>
>> This didn't work as I tried with 197.parser. it works without
>> "-Wl,-disable-opt" switch though.
>>
>> [197.parser]$ llvm-gcc analyze-linkage.c and.c build-disjuncts.c
>> extract-links.c fast-match.c idiom.c main.c massage.c parse.c
>> post-process.c print.c prune.c read-dict.c utilities.c xalloc.c
>> word-file.c strncasecmp.c -Wa,-disable-opt -Wl,-disable-opt -lm -o
>> llvm_parser
>
>
> Note that this will do NO optimization at all, giving you a very very
> ugly .bc file. You might try just -W[al],-disable-inlining instead of
> disabling all optimization.
>
>> [197.parser]$ opt -inline -inline-threshold=200 < llvm_parser.bc |
>> llc -march=c > parser_inline.c llc: bytecode
>> didn't read correctly.
>
>
> This should work, what does opt print? Can you send me [off list] the
> llvm_parser.bc file?
>
>> Does opt call Transform/IPO/InlineSimple to do inlining?
>
>
> Yes.
>
>> as I added instrumentation into it, I found:
>> 1) getInlineCost() is called when doing llvm-gcc (without the
>> -disable* flags)
>
>
> Yes, by default llvm-gcc does optimization, including inlining.
>
>> 2) getInlineCost() is not called when doing opt
>
>
> I assume that this is because opt is crashing or something (which is
> why LLC complains). Please send me the .bc file and I'll try to
> figure out what is going on.
>
>> does the .bc code emitted by llvm-gcc carry inlining cost info ?
>> otherwise, how does opt do inlining without the cost info ?
>
>
> No, the bc file contains no inlining information. The inlining pass
> looks at the IR for the callee and caller and uses heuristics to
> decide the cost of inlining at each call site. The code for this
> lives in lib/Transforms/IPO as misha pointed out before.
>
> -Chris
>
>> Misha Brukman wrote:
>>
>> On Thu, Jul 07, 2005 at 03:52:42PM -0500, Long Fei wrote:
>>
>>> I noticed that the inlining condition (in
>>> Transforms/IPO/InlineSimple.cpp) is tested during llvm-gcc but not
>>> during the opt phase ? Can anybody explain what happens during
>>> llvm-gcc and opt respectively ?
>>>
>>
>> John answered the llvm-gcc part, so let me address the opt part.
>>
>> `opt' is a modular optimizer, but it will do exactly what you tell it to
>> do, and nothing more, so if you say "opt -inline < input.bc > output.bc"
>> it will only inline. Note that if you say "opt < old.bc > new.bc" opt
>> will do nothing.
>>
>> This differs from gccas and gccld which have a built-in list of
>> optimizations that they run, which you can get a list of if you follow
>> the directions here:
>>
>> http://llvm.cs.uiuc.edu/docs/HowToSubmitABug.html#gccas
>> http://llvm.cs.uiuc.edu/docs/HowToSubmitABug.html#gccld
>>
>> or just read their source code.
>>
>>
>> John Criswell wrote:
>>
>>> Long Fei wrote:
>>>
>>>>
>>>> I am investigating some inlining issue, so I did
>>>>
>>>> llvm-gcc aaa.c bbb.c ... nnn.c -o output
>>>> opt -inline -inline-threshold=xxx < output.bc | llc -march=c >
>>>> output_inline.c
>>>
>>>
>>>
>>> I am unsure of whether the LLVM GCC frontend does any inlining.
>>> However, I do know that your methods above run the LLVM inlining
>>> pass, albeit indirectly.
>>>
>>> If you use llvm-gcc to generate and link LLVM bytecode files (as you
>>> do in the example above), llvm-gcc runs gccas and gccld (the
>>> optimizing assembler and optimizing linker, respectively). Both
>>> gccas and gccld run various LLVM optimizations, including inlining.
>>> This allows llvm-gcc to automatically perform interprocedural
>>> optimizations.
>>>
>>> To get a completely unoptimized bytecode file, do the following:
>>>
>>> llvm-gcc aaa.c bbb.c ... nnn.c -Wa,-disable-opt -Wl,-disable-opt -o
>>> output
>>>
>>> That should disable all LLVM optimizations.
>>>
>>> -- John T.
>>>
>>>>
>>>> 1)
>>>> I noticed that even if I set xxx to 0 or even a very small negative
>>>> number, many functions are eliminated. I am wondering if these
>>>> functions are inlined by the frontend, or identified as deadcode.
>>>>
>>>> For instance, SPEC2k bzip2 has 79 functions, after these two steps,
>>>> only 61 functions are left. no other optimizations are used.
>>>>
>>>> 2)
>>>> I noticed that the inlining condition (in
>>>> Transforms/IPO/InlineSimple.cpp) is tested during llvm-gcc but not
>>>> during the opt phase ? Can anybody explain what happens during
>>>> llvm-gcc and opt respectively ?
>>>>
>>>>
>>>> thanks,
>>>> --Long
>>>>
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>> http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>
>>>
>>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
> -Chris
>
More information about the llvm-dev
mailing list