Author: [email protected]
Date: Wed Dec 31 01:09:38 2008
New Revision: 1023

Modified:
    branches/experimental/toiger/src/codegen-ia32.cc

Log:
Experimental: allow register allocation across if statements and empty
statements.
Review URL: http://codereview.chromium.org/17020

Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc    (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc    Wed Dec 31 01:09:38  
2008
@@ -1490,7 +1490,6 @@

  void CodeGenerator::VisitEmptyStatement(EmptyStatement* node) {
    ASSERT(!in_spilled_code());
-  VirtualFrame::SpilledScope spilled_scope(this);
    Comment cmnt(masm_, "// EmptyStatement");
    CodeForStatement(node);
    // nothing to do
@@ -1499,7 +1498,6 @@

  void CodeGenerator::VisitIfStatement(IfStatement* node) {
    ASSERT(!in_spilled_code());
-  VirtualFrame::SpilledScope spilled_scope(this);
    Comment cmnt(masm_, "[ IfStatement");
    // Generate different code depending on which parts of the if statement
    // are present or not.
@@ -1511,84 +1509,84 @@
    if (has_then_stm && has_else_stm) {
      JumpTarget then(this);
      JumpTarget else_(this);
-    // if (cond)
-    LoadConditionAndSpill(node->condition(), NOT_INSIDE_TYPEOF,
-                          &then, &else_, true);
-    // An invalid frame here indicates that the code for the condition
-    // cannot fall-through, i.e. it caused unconditional jumps to the
-    // targets.
+    LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &then, &else_,  
true);
      if (has_valid_frame()) {
+      // We have fallen through from the condition (with a value in  
cc_reg).
+      // Emit a branch if false around the then block and compile both
+      // blocks.
        Branch(false, &else_);
      }
-    // then
-    if (has_valid_frame() || then.is_linked()) {
-      // If control flow can reach the then part via fall-through from the
-      // test or a branch to the target, compile it.
+    if (then.is_linked()) {
        then.Bind();
-      VisitAndSpill(node->then_statement());
      }
-    // A NULL frame here indicates that control did not fall out of the  
then
-    // statement, it escaped on all branches.  In that case, a jump to the
-    // exit label would be dead code (and impossible, because we don't have
-    // a current virtual frame to set at the exit label).
      if (has_valid_frame()) {
+      // We have fallen through from the condition or reached here by a
+      // direct jump to the then target.
+      Visit(node->then_statement());
+    }
+    if (has_valid_frame() && else_.is_linked()) {
+      // We have fallen through from the then block and we need to compile
+      // the else block.  Emit an unconditional jump around it.
        exit.Jump();
      }
-    // else
      if (else_.is_linked()) {
-      // Control flow for if-then-else does not fall-through to the else
-      // part, it can only reach here via jump if at all.
        else_.Bind();
-      VisitAndSpill(node->else_statement());
+      Visit(node->else_statement());
      }

    } else if (has_then_stm) {
      ASSERT(!has_else_stm);
      JumpTarget then(this);
-    // if (cond)
-    LoadConditionAndSpill(node->condition(), NOT_INSIDE_TYPEOF,
-                          &then, &exit, true);
+    LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &then, &exit,  
true);
      if (has_valid_frame()) {
+      // We have fallen through from the condition (with a value in  
cc_reg).
+      // Emit a branch if false around the then block.
        Branch(false, &exit);
      }
-    // then
-    if (has_valid_frame() || then.is_linked()) {
+    if (then.is_linked()) {
        then.Bind();
-      VisitAndSpill(node->then_statement());
+    }
+    if (has_valid_frame()) {
+      // We have fallen through from the condition or reached here by a
+      // direct jump to the then target.
+      Visit(node->then_statement());
      }

    } else if (has_else_stm) {
      ASSERT(!has_then_stm);
      JumpTarget else_(this);
-    // if (!cond)
-    LoadConditionAndSpill(node->condition(), NOT_INSIDE_TYPEOF,
-                          &exit, &else_, true);
+    LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &exit, &else_,  
true);
      if (has_valid_frame()) {
+      // We have fallen through from the condition (with a value in  
cc_reg).
+      // Emit a branch if true around the else block.
        Branch(true, &exit);
      }
-    // else
-    if (has_valid_frame() || else_.is_linked()) {
+    if (else_.is_linked()) {
        else_.Bind();
-      VisitAndSpill(node->else_statement());
+    }
+    if (has_valid_frame()) {
+      // We have fallen through from the condition or reached here by a
+      // direct jump to the else target.
+      Visit(node->else_statement());
      }

    } else {
      ASSERT(!has_then_stm && !has_else_stm);
-    // if (cond)
-    LoadConditionAndSpill(node->condition(), NOT_INSIDE_TYPEOF,
-                          &exit, &exit, false);
+    // We only care about the condition's side effects (not its value or
+    // control flow effect).  LoadCondition is called without forcing a
+    // value into cc_reg.
+    LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &exit, &exit,  
false);
      if (has_valid_frame()) {
+      // Control flow can fall off the end of the condition.  We discard  
its
+      // value, which may be in cc_reg or else on top of the virtual frame.
        if (has_cc()) {
          cc_reg_ = no_condition;
        } else {
-        // No cc value set up, that means the boolean was pushed.
-        // Pop it again, since it is not going to be used.
          frame_->Drop();
        }
      }
    }

-  // end
    if (exit.is_linked()) {
      exit.Bind();
    }

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to