| Index: src/rewriter.cc
|
| ===================================================================
|
| --- src/rewriter.cc (revision 4205)
|
| +++ src/rewriter.cc (working copy)
|
| @@ -220,6 +220,7 @@
|
|
|
|
|
| void AstOptimizer::VisitConditional(Conditional* node) {
|
| + node->condition()->set_no_negative_zero(true);
|
| Visit(node->condition());
|
| Visit(node->then_expression());
|
| Visit(node->else_expression());
|
| @@ -246,7 +247,9 @@
|
| }
|
|
|
| if (FLAG_safe_int32_compiler) {
|
| - if (var->IsStackAllocated() && !var->is_arguments()) {
|
| + if (var->IsStackAllocated() &&
|
| + !var->is_arguments() &&
|
| + var->mode() != Variable::CONST) {
|
| node->set_side_effect_free(true);
|
| }
|
| }
|
| @@ -265,7 +268,14 @@
|
| func_name_inferrer_.PushName(lit_str);
|
| }
|
| } else if (literal->IsHeapNumber()) {
|
| - node->set_side_effect_free(true);
|
| + if (node->to_int32()) {
|
| + // Any HeapNumber has an int32 value if it is the input to a bit op.
|
| + node->set_side_effect_free(true);
|
| + } else {
|
| + double double_value = HeapNumber::cast(*literal)->value();
|
| + int32_t int32_value = DoubleToInt32(double_value);
|
| + node->set_side_effect_free(double_value == int32_value);
|
| + }
|
| }
|
| }
|
|
|
| @@ -319,6 +329,8 @@
|
| node->type()->SetAsLikelySmiIfUnknown();
|
| node->target()->type()->SetAsLikelySmiIfUnknown();
|
| node->value()->type()->SetAsLikelySmiIfUnknown();
|
| + node->value()->set_to_int32(true);
|
| + node->value()->set_no_negative_zero(true);
|
| break;
|
| case Token::ASSIGN_ADD:
|
| case Token::ASSIGN_SUB:
|
| @@ -393,6 +405,7 @@
|
|
|
|
|
| void AstOptimizer::VisitProperty(Property* node) {
|
| + node->key()->set_no_negative_zero(true);
|
| Visit(node->obj());
|
| Visit(node->key());
|
| }
|
| @@ -422,6 +435,11 @@
|
|
|
|
|
| void AstOptimizer::VisitUnaryOperation(UnaryOperation* node) {
|
| + if (node->op() == Token::ADD || node->op() == Token::SUB) {
|
| + node->expression()->set_no_negative_zero(node->no_negative_zero());
|
| + } else {
|
| + node->expression()->set_no_negative_zero(true);
|
| + }
|
| Visit(node->expression());
|
| if (FLAG_safe_int32_compiler) {
|
| switch (node->op()) {
|
| @@ -430,9 +448,9 @@
|
| // Fall through.
|
| case Token::ADD:
|
| case Token::SUB:
|
| - case Token::NOT:
|
| node->set_side_effect_free(node->expression()->side_effect_free());
|
| break;
|
| + case Token::NOT:
|
| case Token::DELETE:
|
| case Token::TYPEOF:
|
| case Token::VOID:
|
| @@ -449,6 +467,9 @@
|
|
|
| void AstOptimizer::VisitCountOperation(CountOperation* node) {
|
| // Count operations assume that they work on Smis.
|
| + node->expression()->set_no_negative_zero(node->is_prefix() ?
|
| + true :
|
| + node->no_negative_zero());
|
| node->type()->SetAsLikelySmiIfUnknown();
|
| node->expression()->type()->SetAsLikelySmiIfUnknown();
|
| Visit(node->expression());
|
| @@ -461,7 +482,12 @@
|
| switch (node->op()) {
|
| case Token::COMMA:
|
| case Token::OR:
|
| + node->left()->set_no_negative_zero(true);
|
| + node->right()->set_no_negative_zero(node->no_negative_zero());
|
| + break;
|
| case Token::AND:
|
| + node->left()->set_no_negative_zero(node->no_negative_zero());
|
| + node->right()->set_no_negative_zero(node->no_negative_zero());
|
| break;
|
| case Token::BIT_OR:
|
| case Token::BIT_XOR:
|
| @@ -474,6 +500,8 @@
|
| node->right()->type()->SetAsLikelySmiIfUnknown();
|
| node->left()->set_to_int32(true);
|
| node->right()->set_to_int32(true);
|
| + node->left()->set_no_negative_zero(true);
|
| + node->right()->set_no_negative_zero(true);
|
| break;
|
| case Token::ADD:
|
| case Token::SUB:
|
| @@ -484,6 +512,13 @@
|
| node->left()->type()->SetAsLikelySmiIfUnknown();
|
| node->right()->type()->SetAsLikelySmiIfUnknown();
|
| }
|
| + node->left()->set_no_negative_zero(node->no_negative_zero());
|
| + node->right()->set_no_negative_zero(node->no_negative_zero());
|
| + if (node->op() == Token::DIV) {
|
| + node->right()->set_no_negative_zero(false);
|
| + } else if (node->op() == Token::MOD) {
|
| + node->right()->set_no_negative_zero(true);
|
| + }
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -528,6 +563,9 @@
|
| case Token::SHL:
|
| case Token::SAR:
|
| case Token::SHR:
|
| + // Add one to the number of bit operations in this expression.
|
| + node->set_num_bit_ops(1);
|
| + // Fall through.
|
| case Token::ADD:
|
| case Token::SUB:
|
| case Token::MUL:
|
| @@ -535,6 +573,12 @@
|
| case Token::MOD:
|
| node->set_side_effect_free(node->left()->side_effect_free() &&
|
| node->right()->side_effect_free());
|
| + node->set_num_bit_ops(node->num_bit_ops() +
|
| + node->left()->num_bit_ops() +
|
| + node->right()->num_bit_ops());
|
| + if (!node->no_negative_zero() && node->op() == Token::MUL) {
|
| + node->set_side_effect_free(false);
|
| + }
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -551,6 +595,10 @@
|
| node->right()->type()->SetAsLikelySmiIfUnknown();
|
| }
|
|
|
| + node->left()->set_no_negative_zero(true);
|
| + // Only [[HasInstance]] has the right argument passed unchanged to it.
|
| + node->right()->set_no_negative_zero(true);
|
| +
|
| Visit(node->left());
|
| Visit(node->right());
|
|
|
|
|