Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index def803bbe727c3dc20b066e42b4f93741ffec68a..53ce1ab772ca97e447aad34dc5db037f437e2b16 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -152,6 +152,10 @@ class AstNode: public ZoneObject { |
virtual ArrayLiteral* AsArrayLiteral() { return NULL; } |
virtual CompareOperation* AsCompareOperation() { return NULL; } |
+ // True if the AST node is critical (its execution is needed or externally |
+ // visible in some way). |
+ virtual bool IsCritical() { UNREACHABLE(); return true; } |
+ |
int num() { return num_; } |
void set_num(int n) { num_ = n; } |
@@ -211,7 +215,7 @@ class Expression: public AstNode { |
virtual bool IsValidLeftHandSide() { return false; } |
- virtual Variable* AssignedVar() { return NULL; } |
+ virtual Variable* AssignedVariable() { return NULL; } |
// Symbols that cannot be parsed as array indices are considered property |
// names. We do not treat symbols that can be array indexes as property |
@@ -283,6 +287,19 @@ class Expression: public AstNode { |
bitfields_ |= NumBitOpsField::encode(num_bit_ops); |
} |
+ // Functions used for dead-code elimination. Predicate is true if the |
+ // expression is not dead code. |
+ int is_live() const { return LiveField::decode(bitfields_); } |
+ void mark_as_live() { bitfields_ |= LiveField::encode(true); } |
+ |
+ // Mark non-live children as live and push them on a stack for further |
+ // processing. |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count) { |
+ } |
+ |
private: |
static const int kMaxNumBitOps = (1 << 5) - 1; |
@@ -295,6 +312,7 @@ class Expression: public AstNode { |
class ToInt32Field : public BitField<bool, 2, 1> {}; |
class NumBitOpsField : public BitField<int, 3, 5> {}; |
class LoopConditionField: public BitField<bool, 8, 1> {}; |
+ class LiveField: public BitField<bool, 9, 1> {}; |
}; |
@@ -881,6 +899,11 @@ class Literal: public Expression { |
virtual bool IsLeaf() { return true; } |
virtual bool IsTrivial() { return true; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
// Identity testers. |
bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); } |
@@ -1087,6 +1110,11 @@ class VariableProxy: public Expression { |
virtual bool IsTrivial() { return is_trivial_; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
void SetIsPrimitive(bool value) { is_primitive_ = value; } |
@@ -1224,6 +1252,11 @@ class Property: public Expression { |
virtual bool IsValidLeftHandSide() { return true; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
Expression* obj() const { return obj_; } |
Expression* key() const { return key_; } |
@@ -1258,6 +1291,11 @@ class Call: public Expression { |
virtual Call* AsCall() { return this; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
Expression* expression() const { return expression_; } |
ZoneList<Expression*>* arguments() const { return arguments_; } |
@@ -1336,6 +1374,11 @@ class UnaryOperation: public Expression { |
virtual UnaryOperation* AsUnaryOperation() { return this; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
Token::Value op() const { return op_; } |
Expression* expression() const { return expression_; } |
@@ -1361,6 +1404,11 @@ class BinaryOperation: public Expression { |
virtual BinaryOperation* AsBinaryOperation() { return this; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
// True iff the result can be safely overwritten (to avoid allocation). |
// False for operations that can return one of their operands. |
@@ -1412,11 +1460,16 @@ class CountOperation: public Expression { |
virtual CountOperation* AsCountOperation() { return this; } |
- virtual Variable* AssignedVar() { |
+ virtual Variable* AssignedVariable() { |
return expression()->AsVariableProxy()->AsVariable(); |
} |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
bool is_prefix() const { return is_prefix_; } |
bool is_postfix() const { return !is_prefix_; } |
@@ -1449,6 +1502,11 @@ class CompareOperation: public Expression { |
virtual void Accept(AstVisitor* v); |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
Token::Value op() const { return op_; } |
Expression* left() const { return left_; } |
@@ -1502,10 +1560,15 @@ class Assignment: public Expression { |
virtual Assignment* AsAssignment() { return this; } |
virtual bool IsPrimitive(); |
+ virtual bool IsCritical(); |
+ virtual void ProcessNonLiveChildren( |
+ List<AstNode*>* stack, |
+ ZoneList<Expression*>* body_definitions, |
+ int variable_count); |
Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
- virtual Variable* AssignedVar() { |
+ virtual Variable* AssignedVariable() { |
return target()->AsVariableProxy()->AsVariable(); |
} |