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.

llvm-svn: 241220
This commit is contained in:
Eric Christopher 2015-07-02 01:11:47 +00:00
parent 41acb31623
commit 4371b13937
4 changed files with 29 additions and 4 deletions

View File

@ -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;
/// @}
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>

View File

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

View File

@ -1344,9 +1344,9 @@ static bool attributeMatches(Function *F1, Function *F2, AttrKind Attr) {
/// \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::getInlineCost(CallSite CS, Function *Callee,
// 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.

View File

@ -284,6 +284,11 @@ Value *TargetTransformInfo::getOrCreateResultFromMemIntrinsic(
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) {}