[llvm] r241220 - Add a routine to TargetTransformInfo that will allow targets to look
David Blaikie
dblaikie at gmail.com
Mon Jul 27 10:36:14 PDT 2015
On Wed, Jul 1, 2015 at 6:42 PM, Eric Christopher <echristo at gmail.com> wrote:
>
>
> On Wed, Jul 1, 2015 at 6:38 PM David Blaikie <dblaikie at gmail.com> wrote:
>
>> On Wed, Jul 1, 2015 at 6:28 PM, Eric Christopher <echristo at gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Wed, Jul 1, 2015 at 6:26 PM David Blaikie <dblaikie at gmail.com> wrote:
>>>
>>>> On Wed, Jul 1, 2015 at 6:11 PM, Eric Christopher <echristo at gmail.com>
>>>> wrote:
>>>>
>>>>> Author: echristo
>>>>> Date: Wed Jul 1 20:11:47 2015
>>>>> New Revision: 241220
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=241220&view=rev
>>>>> Log:
>>>>> Add a routine to TargetTransformInfo that will allow targets to look
>>>>> at the attributes on a function to determine whether or not to allow
>>>>> inlining.
>>>>>
>>>>> Modified:
>>>>> llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>>>>> llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
>>>>> llvm/trunk/lib/Analysis/IPA/InlineCost.cpp
>>>>> llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>>>>>
>>>>> Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=241220&r1=241219&r2=241220&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)
>>>>> +++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Wed Jul 1
>>>>> 20:11:47 2015
>>>>> @@ -519,6 +519,11 @@ public:
>>>>> Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
>>>>> Type *ExpectedType) const;
>>>>>
>>>>> + /// \returns True if the two functions have compatible attributes
>>>>> for inlining
>>>>> + /// purposes.
>>>>> + bool hasCompatibleFunctionAttributes(const Function *Caller,
>>>>> + const Function *Callee) const;
>>>>>
>>>>
>>>> Given that it gets the whole function, perhaps it should be
>>>> "areCompatibleFunctions"? (they could look at other properties of the
>>>> function)
>>>>
>>>>
>>> Naming is hard. No particular preference here so if you like this one
>>> I'll happily change it :)
>>>
>>
>> Right - well, while we're discussing it, is "compatible" fairly
>> unambiguous here - I would imagine there are many senses in which two
>> functions may be compatible? I'm wondering if it would be helpful to
>> clarify what kind of compatibility this test is about. Maybe even
>> "isInlinable"
>>
>
> Yeah. I was trying to make it fairly specific without having a 40
> character name for the function. :\
>
> I'll take any and all naming help :)
>
isInlineCompatible/areInlineCompatible? (that it's talking about compatible
Functions is implied by the type of the operands - but if it helps to
add/keep that word in, I don't think it does much harm/makes it too verbose)
Is this symmetric? I assume not - so maybe it could be more explicit about
that - isInlineable?
(any of these names don't imply anything about this function only doing the
machine-specific parts of the inline test (presumably there's lots of
generic cases that other code tests - recursion, setjmp/longjmp or
whatever) but the context of this being a member function of
TargetTransform I guess implies that sufficientnly?)
> Otherwise, can the attribute set/list/container be passed directly, not
>>>> exposing the whole function to TTI?
>>>>
>>>>
>>>
>>> They could look at other properties, also if you take a look at the x86
>>> one it makes it a bit more obvious that I'm using the function to get
>>> parsed subtarget attributes there.
>>>
>>
>> Right - but other implementations (or this one) might look at other
>> properties eventually. Or it might be useful to be able to just mock up
>> some subtarget attributes (perhaps the subtarget attributes of some other
>> function - not the caller, but a potential caller (function splitting? "I'm
>> considering splitting out half of this function & want to see if the
>> attributes would be OK for inlining this call - but don't look at the rest
>> of the original function, it's not entirely important")).
>>
>> But yeah, no idea what's appropriate/useful/sufficient in TTI, I haven't
>> looked at its API or have much of a sense of how things are done.
>> +Chandler, since he's tangentially involved given the inliner work, in case
>> any of what I'm rambling about makes sense to him. Otherwise we'll just
>> assume I lack sufficiently useful context here.
>>
>>
> Oh, no I was saying that we didn't want to just pass in the bits etc
> because we might want to look at other things - agreeing with you :)
>
> -eric
>
>
>> - Dave
>>
>>
>>>
>>> -eric
>>>
>>>
>>>> +
>>>>> /// @}
>>>>>
>>>>> private:
>>>>> @@ -619,6 +624,8 @@ public:
>>>>> MemIntrinsicInfo &Info) = 0;
>>>>> virtual Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst
>>>>> *Inst,
>>>>> Type
>>>>> *ExpectedType) = 0;
>>>>> + virtual bool hasCompatibleFunctionAttributes(const Function *Caller,
>>>>> + const Function
>>>>> *Callee) const = 0;
>>>>> };
>>>>>
>>>>> template <typename T>
>>>>> @@ -804,6 +811,10 @@ public:
>>>>> Type *ExpectedType)
>>>>> override {
>>>>> return Impl.getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
>>>>> }
>>>>> + bool hasCompatibleFunctionAttributes(const Function *Caller,
>>>>> + const Function *Callee) const
>>>>> override {
>>>>> + return Impl.hasCompatibleFunctionAttributes(Caller, Callee);
>>>>> + }
>>>>> };
>>>>>
>>>>> template <typename T>
>>>>>
>>>>> Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h?rev=241220&r1=241219&r2=241220&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
>>>>> (original)
>>>>> +++ llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h Wed
>>>>> Jul 1 20:11:47 2015
>>>>> @@ -335,6 +335,14 @@ public:
>>>>> Type *ExpectedType) {
>>>>> return nullptr;
>>>>> }
>>>>> +
>>>>> + bool hasCompatibleFunctionAttributes(const Function *Caller,
>>>>> + const Function *Callee) const {
>>>>> + return (Caller->getFnAttribute("target-cpu") ==
>>>>> + Callee->getFnAttribute("target-cpu")) &&
>>>>> + (Caller->getFnAttribute("target-features") ==
>>>>> + Callee->getFnAttribute("target-features"));
>>>>> + }
>>>>> };
>>>>>
>>>>> /// \brief CRTP base class for use as a mix-in that aids implementing
>>>>>
>>>>> Modified: llvm/trunk/lib/Analysis/IPA/InlineCost.cpp
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/InlineCost.cpp?rev=241220&r1=241219&r2=241220&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- llvm/trunk/lib/Analysis/IPA/InlineCost.cpp (original)
>>>>> +++ llvm/trunk/lib/Analysis/IPA/InlineCost.cpp Wed Jul 1 20:11:47 2015
>>>>> @@ -1344,9 +1344,9 @@ static bool attributeMatches(Function *F
>>>>> /// \brief Test that there are no attribute conflicts between Caller
>>>>> and Callee
>>>>> /// that prevent inlining.
>>>>> static bool functionsHaveCompatibleAttributes(Function *Caller,
>>>>> - Function *Callee) {
>>>>> - return attributeMatches(Caller, Callee, "target-cpu") &&
>>>>> - attributeMatches(Caller, Callee, "target-features") &&
>>>>> + Function *Callee,
>>>>> + TargetTransformInfo
>>>>> &TTI) {
>>>>> + return TTI.hasCompatibleFunctionAttributes(Caller, Callee) &&
>>>>> attributeMatches(Caller, Callee, Attribute::SanitizeAddress)
>>>>> &&
>>>>> attributeMatches(Caller, Callee, Attribute::SanitizeMemory)
>>>>> &&
>>>>> attributeMatches(Caller, Callee, Attribute::SanitizeThread);
>>>>> @@ -1368,7 +1368,8 @@ InlineCost InlineCostAnalysis::getInline
>>>>>
>>>>> // Never inline functions with conflicting attributes (unless
>>>>> callee has
>>>>> // always-inline attribute).
>>>>> - if (!functionsHaveCompatibleAttributes(CS.getCaller(), Callee))
>>>>> + if (!functionsHaveCompatibleAttributes(CS.getCaller(), Callee,
>>>>> + TTIWP->getTTI(*Callee)))
>>>>> return llvm::InlineCost::getNever();
>>>>>
>>>>> // Don't inline this call if the caller has the optnone attribute.
>>>>>
>>>>> Modified: llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>>>>> URL:
>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetTransformInfo.cpp?rev=241220&r1=241219&r2=241220&view=diff
>>>>>
>>>>> ==============================================================================
>>>>> --- llvm/trunk/lib/Analysis/TargetTransformInfo.cpp (original)
>>>>> +++ llvm/trunk/lib/Analysis/TargetTransformInfo.cpp Wed Jul 1
>>>>> 20:11:47 2015
>>>>> @@ -284,6 +284,11 @@ Value *TargetTransformInfo::getOrCreateR
>>>>> return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst,
>>>>> ExpectedType);
>>>>> }
>>>>>
>>>>> +bool TargetTransformInfo::hasCompatibleFunctionAttributes(
>>>>> + const Function *Caller, const Function *Callee) const {
>>>>> + return TTIImpl->hasCompatibleFunctionAttributes(Caller, Callee);
>>>>> +}
>>>>> +
>>>>> TargetTransformInfo::Concept::~Concept() {}
>>>>>
>>>>> TargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {}
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150727/592866c9/attachment.html>
More information about the llvm-commits
mailing list