[LLVMdev] Inline hints for *compiler clients*
Vikram S. Adve
vadve at cs.uiuc.edu
Wed Mar 15 14:02:18 PST 2006
On Mar 15, 2006, at 3:27 PM, John Criswell wrote:
> Vikram S. Adve wrote:
>
> Hmmm. It seems the discussion has grown a little bit larger than I
> had intended.
> :)
>
> Basically what I think would be useful is an option to the inliner
> that gives it a list of functions to skip when inlining. My
> argument for this is that we have several transformations now that
> search for calls to specific functions; if those functions are
> inlined, the transform pass can no longer find the calls.
>
> I would like the list of functions excluded from inlining to be
> specified on the command line (as I'm using the LLVM opt command);
> providing a constructor to the Inliner pass that takes a list of
> function names to exclude from inlining might also be handy to LLVM
> programmers but is beyond what I need at the moment.
That seems fine. I just think a more general mechanism that does not
have greater complexity is better than a narrower one. In this case,
replacing the constants with a lookup table that can be modified by
any tool seems like a simple and general way to implement your
option, or the constructor for the Inliner pass, or more
sophisticated tools.
> I think Chris indicated in an earlier email that such a command
> line option is now okay. Chris, please let me know if I understand
> that correctly.
>
> The ability to control inlining from the source code being compiled
> (i.e. GCC's noinline attribute), adjust the inlining heuristics
> programmatically from a custom built LLVM tool, etc, are beyond the
> scope of what I need.
The former is certainly much more complicated. The latter
(controlling heuristics from an LLVM tool) does not seem to be
significantly more complicated.
>
> Hopefully that clears up what I was asking about.
>
> -- John T.
Thanks,
--Vikram
http://www.cs.uiuc.edu/~vadve
http://llvm.cs.uiuc.edu/
>
>> On Mar 15, 2006, at 11:15 AM, Chris Lattner wrote:
>>> On Wed, 15 Mar 2006, Vikram S. Adve wrote:
>>>
>>>>> Why can't the compiler pass just call InlineFunction(CallSite)
>>>>> on the callsite it wants inlined? The only way that can fail
>>>>> is if LLVM cannot ever inline the call (e.g. it uses varargs).
>>>
>>>
>>>> In some cases, that would be fine. But in other cases:
>>>> (1) It cannot "un-inline" any function that was previously inlined.
>>>
>>>
>>> I'm not following. Why do you want to uninline stuff? If we had
>>> a 'never inline these functions' list,
>> We don't have such a list, at least not so far. We do have a
>> "used" list but that's presumably used for other things.
>>> a transformation could add any function it wants to this list to
>>> prevent the inliner from inlining it in the future.
>>>
>>> Aside from that, I don't see what uninlining has to do with
>>> inlining heuristics, can you explain a bit more?
>> I'm not sure what there is to explain. Inlining heuristics
>> control what to inline. If you're writing a tool, you'd want to
>> run the inliner while influencing what it chooses to inline.
>>>> (2) It requires writing a driver loop nest to go over all call
>>>> sites and decide what to do. If all you want is to influence
>>>> the existing heuristics, that seems like too much work.
>>>
>>>
>>> You're talking about something like 5 lines of code, plus the
>>> predicate deciding whether to inline it or not (which you'd need
>>> anyway).
>> That's 5 more lines than if you simply wanted to influence the
>> inlining heuristics.
>>>
>>>> (3) If multiple passes want such control, this would end up
>>>> duplicating the driver code.
>>>
>>>
>>> Again, this is a trivial amount of code.
>> I don't agree.
>>> Giving passes the ability to modify the heuristics used by the
>>> inliner would significantly dwarf this in both amount of code
>>> and complexity.
>> Again, I don't agree. I looked at the getInlineCost(const
>> CallSite& CS) function. It has a dozen or more embedded
>> constants in it. If those used symbolic constant indexes into a
>> cost table, any tool could influence the heuristics simply by
>> changing the values in the table, which (it seems to me) would be
>> simple and intuitive.
>>>
>>> What are you really trying to do here? Can you provide an example?
>> I was just trying to help John by following up on his issue.
>> --Vikram
>> http://www.cs.uiuc.edu/~vadve
>> http://llvm.cs.uiuc.edu/
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
> --
> John T. Criswell
> Research Programmer
> University of Illinois at Urbana-Champaign
> "It's today!" said Piglet. "My favorite day," said Pooh.
>
> _______________________________________________
> 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