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

Reply via email to