Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 45ebfae2c4d53278cfd0d2e12a491ded77d475c6..8d87465abaa2712399ec38bd5557223054c0a912 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -821,7 +821,7 @@ void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) { |
RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
ASSERT(environment->HasBeenRegistered()); |
int id = environment->deoptimization_index(); |
- |
+ ASSERT(info()->IsOptimizing() || info()->IsStub()); |
Deoptimizer::BailoutType bailout_type = info()->IsStub() |
? Deoptimizer::LAZY |
: Deoptimizer::EAGER; |
@@ -832,18 +832,23 @@ void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) { |
} |
ASSERT(FLAG_deopt_every_n_times < 2); // Other values not supported on ARM. |
- |
if (FLAG_deopt_every_n_times == 1 && info_->opt_count() == id) { |
__ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
return; |
} |
- if (FLAG_trap_on_deopt) __ stop("trap_on_deopt", cc); |
+ if (FLAG_trap_on_deopt) { |
+ __ stop("trap_on_deopt", cc); |
+ } |
- bool needs_lazy_deopt = info()->IsStub(); |
ASSERT(info()->IsStub() || frame_is_built_); |
- if (cc == al && !needs_lazy_deopt) { |
- __ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
+ bool needs_lazy_deopt = info()->IsStub(); |
+ if (cc == al && frame_is_built_) { |
+ if (needs_lazy_deopt) { |
+ __ Call(entry, RelocInfo::RUNTIME_ENTRY); |
+ } else { |
+ __ Jump(entry, RelocInfo::RUNTIME_ENTRY); |
+ } |
} else { |
// We often have several deopts to the same entry, reuse the last |
// jump entry if this is the case. |