Remove unused LivenessAnalyzer class.

Also remove unused attributes related to it from the ast.
Review URL: http://codereview.chromium.org/1117003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4194 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent a8a7a74b
...@@ -196,10 +196,7 @@ class Expression: public AstNode { ...@@ -196,10 +196,7 @@ class Expression: public AstNode {
kTestValue kTestValue
}; };
Expression() Expression() : bitfields_(0) {}
: bitfields_(0),
def_(NULL),
defined_vars_(NULL) {}
virtual Expression* AsExpression() { return this; } virtual Expression* AsExpression() { return this; }
...@@ -233,15 +230,6 @@ class Expression: public AstNode { ...@@ -233,15 +230,6 @@ class Expression: public AstNode {
// Static type information for this expression. // Static type information for this expression.
StaticType* type() { return &type_; } StaticType* type() { return &type_; }
// Data flow information.
DefinitionInfo* var_def() { return def_; }
void set_var_def(DefinitionInfo* def) { def_ = def; }
ZoneList<DefinitionInfo*>* defined_vars() { return defined_vars_; }
void set_defined_vars(ZoneList<DefinitionInfo*>* defined_vars) {
defined_vars_ = defined_vars;
}
// AST analysis results // AST analysis results
// True if the expression rooted at this node can be compiled by the // True if the expression rooted at this node can be compiled by the
...@@ -284,9 +272,6 @@ class Expression: public AstNode { ...@@ -284,9 +272,6 @@ class Expression: public AstNode {
uint32_t bitfields_; uint32_t bitfields_;
StaticType type_; StaticType type_;
DefinitionInfo* def_;
ZoneList<DefinitionInfo*>* defined_vars_;
// Using template BitField<type, start, size>. // Using template BitField<type, start, size>.
class SideEffectFreeField : public BitField<bool, 0, 1> {}; class SideEffectFreeField : public BitField<bool, 0, 1> {};
class NoNegativeZeroField : public BitField<bool, 1, 1> {}; class NoNegativeZeroField : public BitField<bool, 1, 1> {};
......
...@@ -770,293 +770,6 @@ void AstLabeler::VisitDeclaration(Declaration* decl) { ...@@ -770,293 +770,6 @@ void AstLabeler::VisitDeclaration(Declaration* decl) {
} }
ZoneList<Expression*>* VarUseMap::Lookup(Variable* var) {
HashMap::Entry* entry = HashMap::Lookup(var, var->name()->Hash(), true);
if (entry->value == NULL) {
entry->value = new ZoneList<Expression*>(1);
}
return reinterpret_cast<ZoneList<Expression*>*>(entry->value);
}
void LivenessAnalyzer::Analyze(FunctionLiteral* fun) {
// Process the function body.
VisitStatements(fun->body());
// All variables are implicitly defined at the function start.
// Record a definition of all variables live at function entry.
for (HashMap::Entry* p = live_vars_.Start();
p != NULL;
p = live_vars_.Next(p)) {
Variable* var = reinterpret_cast<Variable*>(p->key);
RecordDef(var, fun);
}
}
void LivenessAnalyzer::VisitStatements(ZoneList<Statement*>* stmts) {
// Visit statements right-to-left.
for (int i = stmts->length() - 1; i >= 0; i--) {
Visit(stmts->at(i));
}
}
void LivenessAnalyzer::RecordUse(Variable* var, Expression* expr) {
ASSERT(var->is_global() || var->is_this());
ZoneList<Expression*>* uses = live_vars_.Lookup(var);
uses->Add(expr);
}
void LivenessAnalyzer::RecordDef(Variable* var, Expression* expr) {
ASSERT(var->is_global() || var->is_this());
// We do not support other expressions that can define variables.
ASSERT(expr->AsFunctionLiteral() != NULL);
// Add the variable to the list of defined variables.
if (expr->defined_vars() == NULL) {
expr->set_defined_vars(new ZoneList<DefinitionInfo*>(1));
}
DefinitionInfo* def = new DefinitionInfo();
expr->AsFunctionLiteral()->defined_vars()->Add(def);
// Compute the last use of the definition. The variable uses are
// inserted in reversed evaluation order. The first element
// in the list of live uses is the last use.
ZoneList<Expression*>* uses = live_vars_.Lookup(var);
while (uses->length() > 0) {
Expression* use_site = uses->RemoveLast();
use_site->set_var_def(def);
if (uses->length() == 0) {
def->set_last_use(use_site);
}
}
}
// Visitor functions for live variable analysis.
void LivenessAnalyzer::VisitDeclaration(Declaration* decl) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitBlock(Block* stmt) {
VisitStatements(stmt->statements());
}
void LivenessAnalyzer::VisitExpressionStatement(
ExpressionStatement* stmt) {
Visit(stmt->expression());
}
void LivenessAnalyzer::VisitEmptyStatement(EmptyStatement* stmt) {
// Do nothing.
}
void LivenessAnalyzer::VisitIfStatement(IfStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitContinueStatement(ContinueStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitBreakStatement(BreakStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitReturnStatement(ReturnStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitWithEnterStatement(
WithEnterStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitWithExitStatement(WithExitStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitSwitchStatement(SwitchStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitDoWhileStatement(DoWhileStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitWhileStatement(WhileStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitForStatement(ForStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitForInStatement(ForInStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitTryCatchStatement(TryCatchStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitTryFinallyStatement(
TryFinallyStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitDebuggerStatement(
DebuggerStatement* stmt) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitFunctionLiteral(FunctionLiteral* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitFunctionBoilerplateLiteral(
FunctionBoilerplateLiteral* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitConditional(Conditional* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitSlot(Slot* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitVariableProxy(VariableProxy* expr) {
Variable* var = expr->var();
ASSERT(var->is_global());
ASSERT(!var->is_this());
RecordUse(var, expr);
}
void LivenessAnalyzer::VisitLiteral(Literal* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitRegExpLiteral(RegExpLiteral* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitObjectLiteral(ObjectLiteral* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitArrayLiteral(ArrayLiteral* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitCatchExtensionObject(
CatchExtensionObject* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitAssignment(Assignment* expr) {
Property* prop = expr->target()->AsProperty();
ASSERT(prop != NULL);
ASSERT(prop->key()->IsPropertyName());
VariableProxy* proxy = prop->obj()->AsVariableProxy();
ASSERT(proxy != NULL && proxy->var()->is_this());
// Record use of this at the assignment node. Assignments to
// this-properties are treated like unary operations.
RecordUse(proxy->var(), expr);
// Visit right-hand side.
Visit(expr->value());
}
void LivenessAnalyzer::VisitThrow(Throw* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitProperty(Property* expr) {
ASSERT(expr->key()->IsPropertyName());
VariableProxy* proxy = expr->obj()->AsVariableProxy();
ASSERT(proxy != NULL && proxy->var()->is_this());
RecordUse(proxy->var(), expr);
}
void LivenessAnalyzer::VisitCall(Call* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitCallNew(CallNew* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitCallRuntime(CallRuntime* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitUnaryOperation(UnaryOperation* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitCountOperation(CountOperation* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitBinaryOperation(BinaryOperation* expr) {
// Visit child nodes in reverse evaluation order.
Visit(expr->right());
Visit(expr->left());
}
void LivenessAnalyzer::VisitCompareOperation(CompareOperation* expr) {
UNREACHABLE();
}
void LivenessAnalyzer::VisitThisFunction(ThisFunction* expr) {
UNREACHABLE();
}
AssignedVariablesAnalyzer::AssignedVariablesAnalyzer(FunctionLiteral* fun) AssignedVariablesAnalyzer::AssignedVariablesAnalyzer(FunctionLiteral* fun)
: fun_(fun), : fun_(fun),
av_(fun->scope()->num_parameters() + fun->scope()->num_stack_slots()) {} av_(fun->scope()->num_parameters() + fun->scope()->num_stack_slots()) {}
......
...@@ -550,55 +550,6 @@ class AstLabeler: public AstVisitor { ...@@ -550,55 +550,6 @@ class AstLabeler: public AstVisitor {
}; };
class VarUseMap : public HashMap {
public:
VarUseMap() : HashMap(VarMatch) {}
ZoneList<Expression*>* Lookup(Variable* var);
private:
static bool VarMatch(void* key1, void* key2) { return key1 == key2; }
};
class DefinitionInfo : public ZoneObject {
public:
explicit DefinitionInfo() : last_use_(NULL) {}
Expression* last_use() { return last_use_; }
void set_last_use(Expression* expr) { last_use_ = expr; }
private:
Expression* last_use_;
Register location_;
};
class LivenessAnalyzer : public AstVisitor {
public:
LivenessAnalyzer() {}
void Analyze(FunctionLiteral* fun);
private:
void VisitStatements(ZoneList<Statement*>* stmts);
void RecordUse(Variable* var, Expression* expr);
void RecordDef(Variable* var, Expression* expr);
// AST node visit functions.
#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
AST_NODE_LIST(DECLARE_VISIT)
#undef DECLARE_VISIT
// Map for tracking the live variables.
VarUseMap live_vars_;
DISALLOW_COPY_AND_ASSIGN(LivenessAnalyzer);
};
// Computes the set of assigned variables and annotates variables proxies // Computes the set of assigned variables and annotates variables proxies
// that are trivial sub-expressions and for-loops where the loop variable // that are trivial sub-expressions and for-loops where the loop variable
// is guaranteed to be a smi. // is guaranteed to be a smi.
......
...@@ -436,9 +436,6 @@ Handle<Code> FastCodeGenerator::MakeCode(CompilationInfo* info) { ...@@ -436,9 +436,6 @@ Handle<Code> FastCodeGenerator::MakeCode(CompilationInfo* info) {
AstLabeler labeler; AstLabeler labeler;
labeler.Label(info); labeler.Label(info);
LivenessAnalyzer analyzer;
analyzer.Analyze(info->function());
CodeGenerator::MakeCodePrologue(info); CodeGenerator::MakeCodePrologue(info);
const int kInitialBufferSize = 4 * KB; const int kInitialBufferSize = 4 * KB;
...@@ -598,8 +595,8 @@ void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { ...@@ -598,8 +595,8 @@ void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
Comment cmnt(masm(), ";; Global"); Comment cmnt(masm(), ";; Global");
if (FLAG_print_ir) { if (FLAG_print_ir) {
SmartPointer<char> name = expr->name()->ToCString(); SmartPointer<char> name = expr->name()->ToCString();
PrintF("%d: t%d = Global(%s) // last_use = %d\n", expr->num(), PrintF("%d: t%d = Global(%s)\n", expr->num(),
expr->num(), *name, expr->var_def()->last_use()->num()); expr->num(), *name);
} }
EmitGlobalVariableLoad(cell); EmitGlobalVariableLoad(cell);
} }
...@@ -653,9 +650,8 @@ void FastCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -653,9 +650,8 @@ void FastCodeGenerator::VisitAssignment(Assignment* expr) {
SmartPointer<char> name_string = name->ToCString(); SmartPointer<char> name_string = name->ToCString();
PrintF("%d: ", expr->num()); PrintF("%d: ", expr->num());
if (!destination().is(no_reg)) PrintF("t%d = ", expr->num()); if (!destination().is(no_reg)) PrintF("t%d = ", expr->num());
PrintF("Store(this, \"%s\", t%d) // last_use(this) = %d\n", *name_string, PrintF("Store(this, \"%s\", t%d)\n", *name_string,
expr->value()->num(), expr->value()->num());
expr->var_def()->last_use()->num());
} }
EmitThisPropertyStore(name); EmitThisPropertyStore(name);
...@@ -678,9 +674,8 @@ void FastCodeGenerator::VisitProperty(Property* expr) { ...@@ -678,9 +674,8 @@ void FastCodeGenerator::VisitProperty(Property* expr) {
Comment cmnt(masm(), ";; Load from this"); Comment cmnt(masm(), ";; Load from this");
if (FLAG_print_ir) { if (FLAG_print_ir) {
SmartPointer<char> name_string = name->ToCString(); SmartPointer<char> name_string = name->ToCString();
PrintF("%d: t%d = Load(this, \"%s\") // last_use(this) = %d\n", PrintF("%d: t%d = Load(this, \"%s\")\n",
expr->num(), expr->num(), *name_string, expr->num(), expr->num(), *name_string);
expr->var_def()->last_use()->num());
} }
EmitThisPropertyLoad(name); EmitThisPropertyLoad(name);
} }
......
...@@ -436,9 +436,6 @@ Handle<Code> FastCodeGenerator::MakeCode(CompilationInfo* info) { ...@@ -436,9 +436,6 @@ Handle<Code> FastCodeGenerator::MakeCode(CompilationInfo* info) {
AstLabeler labeler; AstLabeler labeler;
labeler.Label(info); labeler.Label(info);
LivenessAnalyzer analyzer;
analyzer.Analyze(info->function());
CodeGenerator::MakeCodePrologue(info); CodeGenerator::MakeCodePrologue(info);
const int kInitialBufferSize = 4 * KB; const int kInitialBufferSize = 4 * KB;
...@@ -802,8 +799,8 @@ void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { ...@@ -802,8 +799,8 @@ void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
Comment cmnt(masm(), ";; Global"); Comment cmnt(masm(), ";; Global");
if (FLAG_print_ir) { if (FLAG_print_ir) {
SmartPointer<char> name = expr->name()->ToCString(); SmartPointer<char> name = expr->name()->ToCString();
PrintF("%d: t%d = Global(%s) // last_use = %d\n", expr->num(), PrintF("%d: t%d = Global(%s)\n", expr->num(),
expr->num(), *name, expr->var_def()->last_use()->num()); expr->num(), *name);
} }
EmitGlobalVariableLoad(cell); EmitGlobalVariableLoad(cell);
} }
...@@ -857,9 +854,8 @@ void FastCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -857,9 +854,8 @@ void FastCodeGenerator::VisitAssignment(Assignment* expr) {
SmartPointer<char> name_string = name->ToCString(); SmartPointer<char> name_string = name->ToCString();
PrintF("%d: ", expr->num()); PrintF("%d: ", expr->num());
if (!destination().is(no_reg)) PrintF("t%d = ", expr->num()); if (!destination().is(no_reg)) PrintF("t%d = ", expr->num());
PrintF("Store(this, \"%s\", t%d) // last_use(this) = %d\n", *name_string, PrintF("Store(this, \"%s\", t%d)\n", *name_string,
expr->value()->num(), expr->value()->num());
expr->var_def()->last_use()->num());
} }
EmitThisPropertyStore(name); EmitThisPropertyStore(name);
...@@ -882,9 +878,8 @@ void FastCodeGenerator::VisitProperty(Property* expr) { ...@@ -882,9 +878,8 @@ void FastCodeGenerator::VisitProperty(Property* expr) {
Comment cmnt(masm(), ";; Load from this"); Comment cmnt(masm(), ";; Load from this");
if (FLAG_print_ir) { if (FLAG_print_ir) {
SmartPointer<char> name_string = name->ToCString(); SmartPointer<char> name_string = name->ToCString();
PrintF("%d: t%d = Load(this, \"%s\") // last_use(this) = %d\n", PrintF("%d: t%d = Load(this, \"%s\")\n",
expr->num(), expr->num(), *name_string, expr->num(), expr->num(), *name_string);
expr->var_def()->last_use()->num());
} }
EmitThisPropertyLoad(name); EmitThisPropertyLoad(name);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment