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,
|
||||
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>
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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) {}
|
||||
|
Loading…
Reference in New Issue
Block a user