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

Reply via email to