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

David Blaikie dblaikie at gmail.com
Wed Jul 1 18:26:28 PDT 2015


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)

Otherwise, can the attribute set/list/container be passed directly, not
exposing the whole function to TTI?


> +
>    /// @}
>
>  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/2fac24df/attachment.html>


More information about the llvm-commits mailing list