Reviewers: William Hesse, Description: Fix type propagation rules for count operation.
Also treat const-variables as not side-effect free. Please review this at http://codereview.chromium.org/982009 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/ia32/codegen-ia32.cc M src/rewriter.cc M test/mjsunit/compiler/loopcount.js Index: test/mjsunit/compiler/loopcount.js =================================================================== --- test/mjsunit/compiler/loopcount.js (revision 4169) +++ test/mjsunit/compiler/loopcount.js (working copy) @@ -53,3 +53,6 @@ return i; } assertEquals(-0x40000001, f5()); + +function f6() { var x = 0x3fffffff; x++; return x+1; } +assertEquals(0x40000001, f6()); Index: src/ia32/codegen-ia32.cc =================================================================== --- src/ia32/codegen-ia32.cc (revision 4169) +++ src/ia32/codegen-ia32.cc (working copy) @@ -6867,7 +6867,12 @@ old_value = allocator_->Allocate(); ASSERT(old_value.is_valid()); __ mov(old_value.reg(), new_value.reg()); + + // The old value that is return for postfix operations has the + // same type as the input value we got from the frame. + old_value.set_number_info(new_value.number_info()); } + // Ensure the new value is writable. frame_->Spill(new_value.reg()); @@ -6931,6 +6936,8 @@ } deferred->BindExit(); + // The result of ++ or -- is always a number. + new_value.set_number_info(NumberInfo::Number()); // Postfix: store the old value in the allocated slot under the // reference. Index: src/rewriter.cc =================================================================== --- src/rewriter.cc (revision 4169) +++ src/rewriter.cc (working copy) @@ -247,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); } } -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
