[llvm] r241220 - Add a routine to TargetTransformInfo that will allow targets to look

Eric Christopher echristo at gmail.com
Wed Jul 1 18:42:40 PDT 2015


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 :)


>
>
>>
>>
>>> 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/20150702/e5bae292/attachment.html>


More information about the llvm-commits mailing list