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

David Blaikie dblaikie at gmail.com
Wed Jul 1 18:38:48 PDT 2015


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"


>
>
>> 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.

- 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/20150701/c7290301/attachment.html>


More information about the llvm-commits mailing list