mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
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:
parent
8ef54c36dd
commit
99d0bcb7d3
@ -519,6 +519,11 @@ public:
|
|||||||
Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
|
Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
|
||||||
Type *ExpectedType) const;
|
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:
|
private:
|
||||||
@ -619,6 +624,8 @@ public:
|
|||||||
MemIntrinsicInfo &Info) = 0;
|
MemIntrinsicInfo &Info) = 0;
|
||||||
virtual Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
|
virtual Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
|
||||||
Type *ExpectedType) = 0;
|
Type *ExpectedType) = 0;
|
||||||
|
virtual bool hasCompatibleFunctionAttributes(const Function *Caller,
|
||||||
|
const Function *Callee) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -804,6 +811,10 @@ public:
|
|||||||
Type *ExpectedType) override {
|
Type *ExpectedType) override {
|
||||||
return Impl.getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
|
return Impl.getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
|
||||||
}
|
}
|
||||||
|
bool hasCompatibleFunctionAttributes(const Function *Caller,
|
||||||
|
const Function *Callee) const override {
|
||||||
|
return Impl.hasCompatibleFunctionAttributes(Caller, Callee);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -335,6 +335,14 @@ public:
|
|||||||
Type *ExpectedType) {
|
Type *ExpectedType) {
|
||||||
return nullptr;
|
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
|
/// \brief CRTP base class for use as a mix-in that aids implementing
|
||||||
|
@ -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
|
/// \brief Test that there are no attribute conflicts between Caller and Callee
|
||||||
/// that prevent inlining.
|
/// that prevent inlining.
|
||||||
static bool functionsHaveCompatibleAttributes(Function *Caller,
|
static bool functionsHaveCompatibleAttributes(Function *Caller,
|
||||||
Function *Callee) {
|
Function *Callee,
|
||||||
return attributeMatches(Caller, Callee, "target-cpu") &&
|
TargetTransformInfo &TTI) {
|
||||||
attributeMatches(Caller, Callee, "target-features") &&
|
return TTI.hasCompatibleFunctionAttributes(Caller, Callee) &&
|
||||||
attributeMatches(Caller, Callee, Attribute::SanitizeAddress) &&
|
attributeMatches(Caller, Callee, Attribute::SanitizeAddress) &&
|
||||||
attributeMatches(Caller, Callee, Attribute::SanitizeMemory) &&
|
attributeMatches(Caller, Callee, Attribute::SanitizeMemory) &&
|
||||||
attributeMatches(Caller, Callee, Attribute::SanitizeThread);
|
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
|
// Never inline functions with conflicting attributes (unless callee has
|
||||||
// always-inline attribute).
|
// always-inline attribute).
|
||||||
if (!functionsHaveCompatibleAttributes(CS.getCaller(), Callee))
|
if (!functionsHaveCompatibleAttributes(CS.getCaller(), Callee,
|
||||||
|
TTIWP->getTTI(*Callee)))
|
||||||
return llvm::InlineCost::getNever();
|
return llvm::InlineCost::getNever();
|
||||||
|
|
||||||
// Don't inline this call if the caller has the optnone attribute.
|
// Don't inline this call if the caller has the optnone attribute.
|
||||||
|
@ -284,6 +284,11 @@ Value *TargetTransformInfo::getOrCreateResultFromMemIntrinsic(
|
|||||||
return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
|
return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TargetTransformInfo::hasCompatibleFunctionAttributes(
|
||||||
|
const Function *Caller, const Function *Callee) const {
|
||||||
|
return TTIImpl->hasCompatibleFunctionAttributes(Caller, Callee);
|
||||||
|
}
|
||||||
|
|
||||||
TargetTransformInfo::Concept::~Concept() {}
|
TargetTransformInfo::Concept::~Concept() {}
|
||||||
|
|
||||||
TargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {}
|
TargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user