Revision: 10132
Author:   [email protected]
Date:     Thu Dec  1 08:57:54 2011
Log:      Revert r10118 from bleeding edge.

It causes several test failures which I need to investigate.
Review URL: http://codereview.chromium.org/8769008
http://code.google.com/p/v8/source/detail?r=10132

Modified:
 /branches/bleeding_edge/src/arm/lithium-arm.cc
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc
 /branches/bleeding_edge/src/hydrogen-instructions.h
 /branches/bleeding_edge/src/hydrogen.cc
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-ia32.h
 /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc
 /branches/bleeding_edge/src/x64/lithium-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc      Thu Dec  1 01:54:05 2011
+++ /branches/bleeding_edge/src/arm/lithium-arm.cc      Thu Dec  1 08:57:54 2011
@@ -2202,7 +2202,12 @@


 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
-  return AssignEnvironment(AssignPointerMap(new LStackCheck));
+  if (instr->is_function_entry()) {
+    return MarkAsCall(new LStackCheck, instr);
+  } else {
+    ASSERT(instr->is_backwards_branch());
+    return AssignEnvironment(AssignPointerMap(new LStackCheck));
+  }
 }


=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Thu Dec 1 01:54:05 2011 +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Thu Dec 1 08:57:54 2011
@@ -4649,22 +4649,38 @@
     LStackCheck* instr_;
   };

-  DeferredStackCheck* deferred_stack_check =
-      new DeferredStackCheck(this, instr);
-  __ LoadRoot(ip, Heap::kStackLimitRootIndex);
-  __ cmp(sp, Operand(ip));
-  __ b(lo, deferred_stack_check->entry());
-  EnsureSpaceForLazyDeopt();
-  __ bind(instr->done_label());
-  deferred_stack_check->SetExit(instr->done_label());
-  // There is no LLazyBailout instruction for stack-checks. We have to
-  // prepare for lazy deoptimization explicitly here.
   ASSERT(instr->HasEnvironment());
   LEnvironment* env = instr->environment();
-  RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
-  // Don't record a deoptimization index for the safepoint here.
-  // This will be done explicitly when emitting call and the safepoint in
-  // the deferred code.
+  // There is no LLazyBailout instruction for stack-checks. We have to
+  // prepare for lazy deoptimization explicitly here.
+  if (instr->hydrogen()->is_function_entry()) {
+    // Perform stack overflow check.
+    Label done;
+    __ LoadRoot(ip, Heap::kStackLimitRootIndex);
+    __ cmp(sp, Operand(ip));
+    __ b(hs, &done);
+    StackCheckStub stub;
+    CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
+    EnsureSpaceForLazyDeopt();
+    __ bind(&done);
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
+  } else {
+    ASSERT(instr->hydrogen()->is_backwards_branch());
+    // Perform stack overflow check if this goto needs it before jumping.
+    DeferredStackCheck* deferred_stack_check =
+        new DeferredStackCheck(this, instr);
+    __ LoadRoot(ip, Heap::kStackLimitRootIndex);
+    __ cmp(sp, Operand(ip));
+    __ b(lo, deferred_stack_check->entry());
+    EnsureSpaceForLazyDeopt();
+    __ bind(instr->done_label());
+    deferred_stack_check->SetExit(instr->done_label());
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    // Don't record a deoptimization index for the safepoint here.
+    // This will be done explicitly when emitting call and the safepoint in
+    // the deferred code.
+  }
 }


=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Thu Dec 1 01:54:05 2011 +++ /branches/bleeding_edge/src/hydrogen-instructions.h Thu Dec 1 08:57:54 2011
@@ -1271,7 +1271,12 @@

 class HStackCheck: public HTemplateInstruction<1> {
  public:
-  explicit HStackCheck(HValue* context) {
+  enum Type {
+    kFunctionEntry,
+    kBackwardsBranch
+  };
+
+  HStackCheck(HValue* context, Type type) : type_(type) {
     SetOperandAt(0, context);
   }

@@ -1288,8 +1293,14 @@
       DeleteFromGraph();
     }
   }
+
+  bool is_function_entry() { return type_ == kFunctionEntry; }
+  bool is_backwards_branch() { return type_ == kBackwardsBranch; }

   DECLARE_CONCRETE_INSTRUCTION(StackCheck)
+
+ private:
+  Type type_;
 };


=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Thu Dec  1 01:54:05 2011
+++ /branches/bleeding_edge/src/hydrogen.cc     Thu Dec  1 08:57:54 2011
@@ -2333,7 +2333,8 @@
     AddSimulate(AstNode::kDeclarationsId);

     HValue* context = environment()->LookupContext();
-    AddInstruction(new(zone()) HStackCheck(context));
+    AddInstruction(
+        new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry));

     VisitStatements(info()->function()->body());
     if (HasStackOverflow()) return NULL;
@@ -2921,7 +2922,8 @@
   BreakAndContinueScope push(break_info, this);
   AddSimulate(stmt->StackCheckId());
   HValue* context = environment()->LookupContext();
-  HStackCheck* stack_check = new(zone()) HStackCheck(context);
+  HStackCheck* stack_check =
+    new(zone()) HStackCheck(context, HStackCheck::kBackwardsBranch);
   AddInstruction(stack_check);
   ASSERT(loop_entry->IsLoopHeader());
   loop_entry->loop_information()->set_stack_check(stack_check);
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Thu Dec 1 01:54:05 2011 +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Thu Dec 1 08:57:54 2011
@@ -4554,23 +4554,43 @@
     LStackCheck* instr_;
   };

-  DeferredStackCheck* deferred_stack_check =
-      new DeferredStackCheck(this, instr);
-  ExternalReference stack_limit =
-      ExternalReference::address_of_stack_limit(isolate());
-  __ cmp(esp, Operand::StaticVariable(stack_limit));
-  __ j(below, deferred_stack_check->entry());
-  EnsureSpaceForLazyDeopt();
-  __ bind(instr->done_label());
-  deferred_stack_check->SetExit(instr->done_label());
-  // There is no LLazyBailout instruction for stack-checks. We have to
-  // prepare for lazy deoptimization explicitly here.
   ASSERT(instr->HasEnvironment());
   LEnvironment* env = instr->environment();
-  RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
-  // Don't record a deoptimization index for the safepoint here.
-  // This will be done explicitly when emitting call and the safepoint in
-  // the deferred code.
+  // There is no LLazyBailout instruction for stack-checks. We have to
+  // prepare for lazy deoptimization explicitly here.
+  if (instr->hydrogen()->is_function_entry()) {
+    // Perform stack overflow check.
+    Label done;
+    ExternalReference stack_limit =
+        ExternalReference::address_of_stack_limit(isolate());
+    __ cmp(esp, Operand::StaticVariable(stack_limit));
+    __ j(above_equal, &done, Label::kNear);
+
+    ASSERT(instr->context()->IsRegister());
+    ASSERT(ToRegister(instr->context()).is(esi));
+    StackCheckStub stub;
+    CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
+    EnsureSpaceForLazyDeopt();
+    __ bind(&done);
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
+  } else {
+    ASSERT(instr->hydrogen()->is_backwards_branch());
+    // Perform stack overflow check if this goto needs it before jumping.
+    DeferredStackCheck* deferred_stack_check =
+        new DeferredStackCheck(this, instr);
+    ExternalReference stack_limit =
+        ExternalReference::address_of_stack_limit(isolate());
+    __ cmp(esp, Operand::StaticVariable(stack_limit));
+    __ j(below, deferred_stack_check->entry());
+    EnsureSpaceForLazyDeopt();
+    __ bind(instr->done_label());
+    deferred_stack_check->SetExit(instr->done_label());
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    // Don't record a deoptimization index for the safepoint here.
+    // This will be done explicitly when emitting call and the safepoint in
+    // the deferred code.
+  }
 }


=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Thu Dec 1 01:54:05 2011 +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Thu Dec 1 08:57:54 2011
@@ -2328,9 +2328,15 @@


 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
-  LOperand* context = UseAny(instr->context());
-  return AssignEnvironment(
-      AssignPointerMap(new(zone()) LStackCheck(context)));
+  if (instr->is_function_entry()) {
+    LOperand* context = UseFixed(instr->context(), esi);
+    return MarkAsCall(new(zone()) LStackCheck(context), instr);
+  } else {
+    ASSERT(instr->is_backwards_branch());
+    LOperand* context = UseAny(instr->context());
+    return AssignEnvironment(
+        AssignPointerMap(new(zone()) LStackCheck(context)));
+  }
 }


=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.h     Thu Dec  1 01:54:05 2011
+++ /branches/bleeding_edge/src/ia32/lithium-ia32.h     Thu Dec  1 08:57:54 2011
@@ -227,6 +227,7 @@
   void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
   LPointerMap* pointer_map() const { return pointer_map_.get(); }
   bool HasPointerMap() const { return pointer_map_.is_set(); }
+

   void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
   HValue* hydrogen_value() const { return hydrogen_value_; }
=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Thu Dec 1 06:19:34 2011 +++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Thu Dec 1 08:57:54 2011
@@ -4263,21 +4263,38 @@
     LStackCheck* instr_;
   };

-  DeferredStackCheck* deferred_stack_check =
-      new DeferredStackCheck(this, instr);
-  __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
-  __ j(below, deferred_stack_check->entry());
-  EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
-  __ bind(instr->done_label());
-  deferred_stack_check->SetExit(instr->done_label());
-  // There is no LLazyBailout instruction for stack-checks. We have to
-  // prepare for lazy deoptimization explicitly here.
   ASSERT(instr->HasEnvironment());
   LEnvironment* env = instr->environment();
-  RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
-  // Don't record a deoptimization index for the safepoint here.
-  // This will be done explicitly when emitting call and the safepoint in
-  // the deferred code.
+  // There is no LLazyBailout instruction for stack-checks. We have to
+  // prepare for lazy deoptimization explicitly here.
+  if (instr->hydrogen()->is_function_entry()) {
+    // Perform stack overflow check.
+    Label done;
+    __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
+    __ j(above_equal, &done, Label::kNear);
+    StackCheckStub stub;
+    CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
+    EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
+    last_lazy_deopt_pc_ = masm()->pc_offset();
+    __ bind(&done);
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
+  } else {
+    ASSERT(instr->hydrogen()->is_backwards_branch());
+    // Perform stack overflow check if this goto needs it before jumping.
+    DeferredStackCheck* deferred_stack_check =
+        new DeferredStackCheck(this, instr);
+    __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
+    __ j(below, deferred_stack_check->entry());
+    EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
+    last_lazy_deopt_pc_ = masm()->pc_offset();
+    __ bind(instr->done_label());
+    deferred_stack_check->SetExit(instr->done_label());
+    RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
+    // Don't record a deoptimization index for the safepoint here.
+    // This will be done explicitly when emitting call and the safepoint in
+    // the deferred code.
+  }
 }


=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc      Thu Dec  1 01:54:05 2011
+++ /branches/bleeding_edge/src/x64/lithium-x64.cc      Thu Dec  1 08:57:54 2011
@@ -2203,7 +2203,12 @@


 LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
-  return AssignEnvironment(AssignPointerMap(new LStackCheck));
+  if (instr->is_function_entry()) {
+    return MarkAsCall(new LStackCheck, instr);
+  } else {
+    ASSERT(instr->is_backwards_branch());
+    return AssignEnvironment(AssignPointerMap(new LStackCheck));
+  }
 }


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

Reply via email to