Revision: 4178 Author: [email protected] Date: Thu Mar 18 03:06:01 2010 Log: Mere r4172 and r4177 to trunk. The new version is 2.1.6.1.
Review URL: http://codereview.chromium.org/1108001 http://code.google.com/p/v8/source/detail?r=4178 Modified: /trunk/src/ia32/codegen-ia32.cc /trunk/src/rewriter.cc /trunk/src/version.cc /trunk/test/mjsunit/compiler/loopcount.js ======================================= --- /trunk/src/ia32/codegen-ia32.cc Wed Mar 17 06:18:24 2010 +++ /trunk/src/ia32/codegen-ia32.cc Thu Mar 18 03:06:01 2010 @@ -3762,6 +3762,21 @@ Visit(node->next()); } } + + // The update expression resets the type of the loop variable. So we + // set it to smi before compiling the test expression. + if (node->is_fast_smi_loop()) { + // Set number type of the loop variable to smi. + Slot* slot = node->loop_variable()->slot(); + ASSERT(slot->type() == Slot::LOCAL); + frame_->SetTypeForLocalAt(slot->index(), NumberInfo::Smi()); + if (FLAG_debug_code) { + frame_->PushLocalAt(slot->index()); + Result var = frame_->Pop(); + var.ToRegister(); + __ AbortIfNotSmi(var.reg(), "Loop variable not a smi."); + } + } // Based on the condition analysis, compile the backward jump as // necessary. @@ -6867,7 +6882,12 @@ old_value = allocator_->Allocate(); ASSERT(old_value.is_valid()); __ mov(old_value.reg(), new_value.reg()); - } + + // The return value for postfix operations is the + // same as the input, and has the same number info. + old_value.set_number_info(new_value.number_info()); + } + // Ensure the new value is writable. frame_->Spill(new_value.reg()); @@ -6931,6 +6951,13 @@ } deferred->BindExit(); + // The result of ++ or -- is an Integer32 if the + // input is a smi. Otherwise it is a number. + if (new_value.is_smi()) { + new_value.set_number_info(NumberInfo::Integer32()); + } else { + new_value.set_number_info(NumberInfo::Number()); + } // Postfix: store the old value in the allocated slot under the // reference. ======================================= --- /trunk/src/rewriter.cc Wed Mar 17 06:18:24 2010 +++ /trunk/src/rewriter.cc Thu Mar 18 03:06:01 2010 @@ -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); } } ======================================= --- /trunk/src/version.cc Wed Mar 17 06:18:24 2010 +++ /trunk/src/version.cc Thu Mar 18 03:06:01 2010 @@ -35,7 +35,7 @@ #define MAJOR_VERSION 2 #define MINOR_VERSION 1 #define BUILD_NUMBER 6 -#define PATCH_LEVEL 0 +#define PATCH_LEVEL 1 #define CANDIDATE_VERSION false // Define SONAME to have the SCons build the put a specific SONAME into the ======================================= --- /trunk/test/mjsunit/compiler/loopcount.js Wed Mar 17 06:18:24 2010 +++ /trunk/test/mjsunit/compiler/loopcount.js Thu Mar 18 03:06:01 2010 @@ -53,3 +53,6 @@ return i; } assertEquals(-0x40000001, f5()); + +function f6() { var x = 0x3fffffff; x++; return x+1; } +assertEquals(0x40000001, f6()); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
