int DepthFirstVisitor<Pre, OptVisitor>::visitScope(BlockScopeRawPtr scope) { int updates, all_updates = 0; StatementPtr stmt = scope->getStmt(); if (MethodStatementPtr m = dynamic_pointer_cast<MethodStatement>(stmt)) { do { scope->clearUpdated(); StatementPtr rep = this->visitStmtRecur(stmt); always_assert(!rep); updates = scope->getUpdated(); all_updates |= updates; } while (updates); if (all_updates & BlockScope::UseKindCaller) { all_updates &= ~BlockScope::UseKindCaller; } return all_updates; } do { scope->clearUpdated(); StatementPtr rep = this->visitStmtRecur(stmt); always_assert(!rep); updates = scope->getUpdated(); all_updates |= updates; } while (updates); return all_updates; }
int DepthFirstVisitor<Pre, OptVisitor>::visitScope(BlockScopeRawPtr scope) { int updates, all_updates = 0; StatementPtr stmt = scope->getStmt(); if (MethodStatementPtr m = dynamic_pointer_cast<MethodStatement>(stmt)) { WriteLock lock(m->getFunctionScope()->getInlineMutex()); do { scope->clearUpdated(); if (Option::LocalCopyProp || Option::EliminateDeadCode) { AliasManager am(-1); if (am.optimize(this->m_data.m_ar, m)) { scope->addUpdates(BlockScope::UseKindCaller); } } else { StatementPtr rep = this->visitStmtRecur(stmt); always_assert(!rep); } updates = scope->getUpdated(); all_updates |= updates; } while (updates); if (all_updates & BlockScope::UseKindCaller && !m->getFunctionScope()->getInlineAsExpr()) { all_updates &= ~BlockScope::UseKindCaller; } return all_updates; } do { scope->clearUpdated(); StatementPtr rep = this->visitStmtRecur(stmt); always_assert(!rep); updates = scope->getUpdated(); all_updates |= updates; } while (updates); return all_updates; }