Remove recursion checks from inliner.
We no longer allow recursive code anywhere, so the inliner doesn't need to guard against recursion. Change-Id: I1cd39e215d0b93b8a5b578eb20854075f7e48ed5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/534779 Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Arman Uguray <armansito@google.com> Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
parent
294aaf9457
commit
240c55f97b
@ -111,37 +111,6 @@ static int count_returns_at_end_of_control_flow(const FunctionDefinition& funcDe
|
|||||||
return CountReturnsAtEndOfControlFlow{funcDef}.fNumReturns;
|
return CountReturnsAtEndOfControlFlow{funcDef}.fNumReturns;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool contains_recursive_call(const FunctionDeclaration& funcDecl) {
|
|
||||||
class ContainsRecursiveCall : public ProgramVisitor {
|
|
||||||
public:
|
|
||||||
bool visit(const FunctionDeclaration& funcDecl) {
|
|
||||||
fFuncDecl = &funcDecl;
|
|
||||||
return funcDecl.definition() ? this->visitProgramElement(*funcDecl.definition())
|
|
||||||
: false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool visitExpression(const Expression& expr) override {
|
|
||||||
if (expr.is<FunctionCall>() && expr.as<FunctionCall>().function().matches(*fFuncDecl)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return INHERITED::visitExpression(expr);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool visitStatement(const Statement& stmt) override {
|
|
||||||
if (stmt.is<InlineMarker>() &&
|
|
||||||
stmt.as<InlineMarker>().function().matches(*fFuncDecl)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return INHERITED::visitStatement(stmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
const FunctionDeclaration* fFuncDecl;
|
|
||||||
using INHERITED = ProgramVisitor;
|
|
||||||
};
|
|
||||||
|
|
||||||
return ContainsRecursiveCall{}.visit(funcDecl);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::unique_ptr<Statement>* find_parent_statement(
|
static std::unique_ptr<Statement>* find_parent_statement(
|
||||||
const std::vector<std::unique_ptr<Statement>*>& stmtStack) {
|
const std::vector<std::unique_ptr<Statement>*>& stmtStack) {
|
||||||
SkASSERT(!stmtStack.empty());
|
SkASSERT(!stmtStack.empty());
|
||||||
@ -1068,9 +1037,7 @@ bool Inliner::candidateCanBeInlined(const InlineCandidate& candidate,
|
|||||||
if (const bool* cachedInlinability = cache->find(&funcDecl)) {
|
if (const bool* cachedInlinability = cache->find(&funcDecl)) {
|
||||||
return *cachedInlinability;
|
return *cachedInlinability;
|
||||||
}
|
}
|
||||||
// Recursion is forbidden here to avoid an infinite death spiral of inlining.
|
bool inlinability = this->isSafeToInline(funcDecl.definition(), usage);
|
||||||
bool inlinability = this->isSafeToInline(funcDecl.definition(), usage) &&
|
|
||||||
!contains_recursive_call(funcDecl);
|
|
||||||
cache->set(&funcDecl, inlinability);
|
cache->set(&funcDecl, inlinability);
|
||||||
return inlinability;
|
return inlinability;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user