Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 57220e0de1e5cf77641235343b45aba12249cb8a..ff5dff1abe5b529d74a979b9985cdd179c1a1901 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -146,26 +146,6 @@ void HBasicBlock::AddInstruction(HInstruction* instr) { |
} |
-HDeoptimize* HBasicBlock::CreateDeoptimize( |
- HDeoptimize::UseEnvironment has_uses) { |
- ASSERT(HasEnvironment()); |
- if (has_uses == HDeoptimize::kNoUses) |
- return new(zone()) HDeoptimize(0, 0, 0, zone()); |
- |
- HEnvironment* environment = last_environment(); |
- int first_local_index = environment->first_local_index(); |
- int first_expression_index = environment->first_expression_index(); |
- HDeoptimize* instr = new(zone()) HDeoptimize( |
- environment->length(), first_local_index, first_expression_index, zone()); |
- for (int i = 0; i < environment->length(); i++) { |
- HValue* val = environment->values()->at(i); |
- instr->AddEnvironmentValue(val, zone()); |
- } |
- |
- return instr; |
-} |
- |
- |
HSimulate* HBasicBlock::CreateSimulate(BailoutId ast_id, |
RemovableSimulate removable) { |
ASSERT(HasEnvironment()); |
@@ -700,13 +680,16 @@ HGraphBuilder::IfBuilder::IfBuilder(HGraphBuilder* builder, int position) |
: builder_(builder), |
position_(position), |
finished_(false), |
+ deopt_then_(false), |
+ deopt_else_(false), |
did_then_(false), |
did_else_(false), |
did_and_(false), |
did_or_(false), |
captured_(false), |
needs_compare_(true), |
- split_edge_merge_block_(NULL) { |
+ split_edge_merge_block_(NULL), |
+ merge_block_(NULL) { |
HEnvironment* env = builder->environment(); |
first_true_block_ = builder->CreateBasicBlock(env->Copy()); |
last_true_block_ = NULL; |
@@ -720,6 +703,8 @@ HGraphBuilder::IfBuilder::IfBuilder( |
: builder_(builder), |
position_(RelocInfo::kNoPosition), |
finished_(false), |
+ deopt_then_(false), |
+ deopt_else_(false), |
did_then_(false), |
did_else_(false), |
did_and_(false), |
@@ -836,14 +821,13 @@ void HGraphBuilder::IfBuilder::Else() { |
void HGraphBuilder::IfBuilder::Deopt() { |
- HBasicBlock* block = builder_->current_block(); |
- block->FinishExitWithDeoptimization(HDeoptimize::kUseAll); |
- builder_->set_current_block(NULL); |
+ ASSERT(did_then_); |
if (did_else_) { |
- first_false_block_ = NULL; |
+ deopt_else_ = true; |
} else { |
- first_true_block_ = NULL; |
+ deopt_then_ = true; |
} |
+ builder_->Add<HDeoptimize>(Deoptimizer::EAGER); |
} |
@@ -868,20 +852,30 @@ void HGraphBuilder::IfBuilder::End() { |
last_true_block_ = builder_->current_block(); |
} |
if (first_true_block_ == NULL) { |
- // Deopt on true. Nothing to do, just continue the false block. |
+ // Return on true. Nothing to do, just continue the false block. |
} else if (first_false_block_ == NULL) { |
// Deopt on false. Nothing to do except switching to the true block. |
builder_->set_current_block(last_true_block_); |
} else { |
- HEnvironment* merge_env = last_true_block_->last_environment()->Copy(); |
- merge_block_ = builder_->CreateBasicBlock(merge_env); |
+ merge_block_ = builder_->graph()->CreateBasicBlock(); |
ASSERT(!finished_); |
if (!did_else_) Else(); |
ASSERT(!last_true_block_->IsFinished()); |
HBasicBlock* last_false_block = builder_->current_block(); |
ASSERT(!last_false_block->IsFinished()); |
- last_true_block_->GotoNoSimulate(merge_block_); |
- last_false_block->GotoNoSimulate(merge_block_); |
+ if (deopt_then_) { |
+ last_false_block->GotoNoSimulate(merge_block_); |
+ builder_->PadEnvironmentForContinuation(last_true_block_, |
+ merge_block_); |
+ last_true_block_->GotoNoSimulate(merge_block_); |
+ } else { |
+ last_true_block_->GotoNoSimulate(merge_block_); |
+ if (deopt_else_) { |
+ builder_->PadEnvironmentForContinuation(last_false_block, |
+ merge_block_); |
+ } |
+ last_false_block->GotoNoSimulate(merge_block_); |
+ } |
builder_->set_current_block(merge_block_); |
} |
} |
@@ -991,36 +985,6 @@ HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
} |
-void HGraphBuilder::AddSimulate(BailoutId id, |
- RemovableSimulate removable) { |
- ASSERT(current_block() != NULL); |
- ASSERT(no_side_effects_scope_count_ == 0); |
- current_block()->AddSimulate(id, removable); |
-} |
- |
- |
-HReturn* HGraphBuilder::AddReturn(HValue* value) { |
- HValue* context = environment()->LookupContext(); |
- int num_parameters = graph()->info()->num_parameters(); |
- HValue* params = Add<HConstant>(num_parameters); |
- HReturn* return_instruction = new(graph()->zone()) |
- HReturn(value, context, params); |
- current_block()->FinishExit(return_instruction); |
- return return_instruction; |
-} |
- |
- |
-void HGraphBuilder::AddSoftDeoptimize(SoftDeoptimizeMode mode) { |
- isolate()->counters()->soft_deopts_requested()->Increment(); |
- if (FLAG_always_opt && mode == CAN_OMIT_SOFT_DEOPT) return; |
- if (current_block()->IsDeoptimizing()) return; |
- Add<HSoftDeoptimize>(); |
- isolate()->counters()->soft_deopts_inserted()->Increment(); |
- current_block()->MarkAsDeoptimizing(); |
- graph()->set_has_soft_deoptimize(true); |
-} |
- |
- |
HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { |
HBasicBlock* b = graph()->CreateBasicBlock(); |
b->SetInitialEnvironment(env); |
@@ -1043,8 +1007,40 @@ HValue* HGraphBuilder::BuildCheckHeapObject(HValue* obj) { |
} |
-HValue* HGraphBuilder::BuildCheckMap(HValue* obj, |
- Handle<Map> map) { |
+void HGraphBuilder::FinishExitWithHardDeoptimization( |
+ HBasicBlock* continuation) { |
+ PadEnvironmentForContinuation(current_block(), continuation); |
+ Add<HDeoptimize>(Deoptimizer::EAGER); |
+ if (no_side_effects_scope_count_ > 0) { |
+ current_block()->GotoNoSimulate(continuation); |
+ } else { |
+ current_block()->Goto(continuation); |
+ } |
+} |
+ |
+ |
+void HGraphBuilder::PadEnvironmentForContinuation( |
+ HBasicBlock* from, |
+ HBasicBlock* continuation) { |
+ if (continuation->last_environment() != NULL) { |
+ // When merging from a deopt block to a continuation, resolve differences in |
+ // environment by pushing undefined and popping extra values so that the |
+ // environments match during the join. |
+ int continuation_env_length = continuation->last_environment()->length(); |
+ while (continuation_env_length != from->last_environment()->length()) { |
+ if (continuation_env_length > from->last_environment()->length()) { |
+ from->last_environment()->Push(graph()->GetConstantUndefined()); |
+ } else { |
+ from->last_environment()->Pop(); |
+ } |
+ } |
+ } else { |
+ ASSERT(continuation->predecessors()->length() == 0); |
+ } |
+} |
+ |
+ |
+HValue* HGraphBuilder::BuildCheckMap(HValue* obj, Handle<Map> map) { |
HCheckMaps* check = HCheckMaps::New(obj, map, zone()); |
AddInstruction(check); |
return check; |
@@ -1719,7 +1715,7 @@ HInstruction* HGraphBuilder::BuildUnaryMathOp( |
input, graph()->GetConstantMinus1()); |
Representation rep = Representation::FromType(type); |
if (type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
if (instr->IsBinaryOperation()) { |
HBinaryOperation* binop = HBinaryOperation::cast(instr); |
@@ -1730,7 +1726,7 @@ HInstruction* HGraphBuilder::BuildUnaryMathOp( |
} |
case Token::BIT_NOT: |
if (type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
return new(zone()) HBitNot(input); |
} |
@@ -2638,7 +2634,7 @@ void EffectContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) { |
ASSERT(!instr->IsControlInstruction()); |
owner()->AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
- owner()->AddSimulate(ast_id, REMOVABLE_SIMULATE); |
+ owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
} |
} |
@@ -2680,7 +2676,7 @@ void ValueContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) { |
owner()->AddInstruction(instr); |
owner()->Push(instr); |
if (instr->HasObservableSideEffects()) { |
- owner()->AddSimulate(ast_id, REMOVABLE_SIMULATE); |
+ owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
} |
} |
@@ -2736,7 +2732,7 @@ void TestContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) { |
// this one isn't actually needed (and wouldn't work if it were targeted). |
if (instr->HasObservableSideEffects()) { |
builder->Push(instr); |
- builder->AddSimulate(ast_id, REMOVABLE_SIMULATE); |
+ builder->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
builder->Pop(); |
} |
BuildBranch(instr); |
@@ -2924,7 +2920,7 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
VisitVariableDeclaration(scope->function()); |
} |
VisitDeclarations(scope->declarations()); |
- AddSimulate(BailoutId::Declarations()); |
+ Add<HSimulate>(BailoutId::Declarations()); |
HValue* context = environment()->LookupContext(); |
Add<HStackCheck>(context, HStackCheck::kFunctionEntry); |
@@ -2933,7 +2929,7 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
if (HasStackOverflow()) return false; |
if (current_block() != NULL) { |
- AddReturn(graph()->GetConstantUndefined()); |
+ Add<HReturn>(graph()->GetConstantUndefined()); |
set_current_block(NULL); |
} |
@@ -3223,10 +3219,10 @@ void HOptimizedGraphBuilder::VisitIfStatement(IfStatement* stmt) { |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
if (stmt->condition()->ToBooleanIsTrue()) { |
- AddSimulate(stmt->ThenId()); |
+ Add<HSimulate>(stmt->ThenId()); |
Visit(stmt->then_statement()); |
} else if (stmt->condition()->ToBooleanIsFalse()) { |
- AddSimulate(stmt->ElseId()); |
+ Add<HSimulate>(stmt->ElseId()); |
Visit(stmt->else_statement()); |
} else { |
HBasicBlock* cond_true = graph()->CreateBasicBlock(); |
@@ -3333,7 +3329,7 @@ void HOptimizedGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
// Not an inlined return, so an actual one. |
CHECK_ALIVE(VisitForValue(stmt->expression())); |
HValue* result = environment()->Pop(); |
- AddReturn(result); |
+ Add<HReturn>(result); |
} else if (state->inlining_kind() == CONSTRUCT_CALL_RETURN) { |
// Return from an inlined construct call. In a test context the return value |
// will always evaluate to true, in a value context the return value needs |
@@ -3425,7 +3421,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
HValue* context = environment()->LookupContext(); |
CHECK_ALIVE(VisitForValue(stmt->tag())); |
- AddSimulate(stmt->EntryId()); |
+ Add<HSimulate>(stmt->EntryId()); |
HValue* tag_value = Pop(); |
HBasicBlock* first_test_block = current_block(); |
@@ -3465,7 +3461,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
if (stmt->switch_type() == SwitchStatement::SMI_SWITCH) { |
if (!clause->compare_type()->Is(Type::Smi())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
HCompareNumericAndBranch* compare_ = |
@@ -3515,7 +3511,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
normal_block = last_block; |
last_block = NULL; // Cleared to indicate we've handled it. |
} |
- } else if (!curr_test_block->end()->IsDeoptimize()) { |
+ } else { |
normal_block = curr_test_block->end()->FirstSuccessor(); |
curr_test_block = curr_test_block->end()->SecondSuccessor(); |
} |
@@ -3569,7 +3565,7 @@ void HOptimizedGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
HBasicBlock* loop_entry, |
BreakAndContinueInfo* break_info) { |
BreakAndContinueScope push(break_info, this); |
- AddSimulate(stmt->StackCheckId()); |
+ Add<HSimulate>(stmt->StackCheckId()); |
HValue* context = environment()->LookupContext(); |
HStackCheck* stack_check = Add<HStackCheck>( |
context, HStackCheck::kBackwardsBranch); |
@@ -3730,7 +3726,7 @@ void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
HInstruction* map = Add<HForInPrepareMap>( |
environment()->LookupContext(), enumerable); |
- AddSimulate(stmt->PrepareId()); |
+ Add<HSimulate>(stmt->PrepareId()); |
HInstruction* array = Add<HForInCacheArray>( |
enumerable, map, DescriptorArray::kEnumCacheBridgeCacheIndex); |
@@ -4327,7 +4323,7 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
} |
AddInstruction(store); |
if (store->HasObservableSideEffects()) { |
- AddSimulate(key->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(key->id(), REMOVABLE_SIMULATE); |
} |
} else { |
CHECK_ALIVE(VisitForEffect(value)); |
@@ -4492,7 +4488,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
break; |
} |
- AddSimulate(expr->GetIdForElement(i)); |
+ Add<HSimulate>(expr->GetIdForElement(i)); |
} |
Drop(1); // array literal index |
@@ -4822,7 +4818,7 @@ bool HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic( |
if (!ast_context()->IsEffect()) Push(result_value); |
store->set_position(position); |
AddInstruction(store); |
- AddSimulate(assignment_id); |
+ Add<HSimulate>(assignment_id); |
if (!ast_context()->IsEffect()) Drop(1); |
ast_context()->ReturnValue(result_value); |
return true; |
@@ -4881,7 +4877,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |
// know about and do not want to handle ones we've never seen. Otherwise |
// use a generic IC. |
if (count == types->length() && FLAG_deoptimize_uncommon_cases) { |
- current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); |
+ FinishExitWithHardDeoptimization(join); |
} else { |
HInstruction* instr = BuildStoreNamedGeneric(object, name, store_value); |
instr->set_position(position); |
@@ -4898,10 +4894,10 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |
// unoptimized code). |
if (instr->HasObservableSideEffects()) { |
if (ast_context()->IsEffect()) { |
- AddSimulate(assignment_id, REMOVABLE_SIMULATE); |
+ Add<HSimulate>(assignment_id, REMOVABLE_SIMULATE); |
} else { |
Push(result_value); |
- AddSimulate(assignment_id, REMOVABLE_SIMULATE); |
+ Add<HSimulate>(assignment_id, REMOVABLE_SIMULATE); |
Drop(1); |
} |
} |
@@ -4929,7 +4925,7 @@ void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
HValue* value = environment()->ExpressionStackAt(0); |
HValue* object = environment()->ExpressionStackAt(1); |
- if (expr->IsUninitialized()) AddSoftDeoptimize(); |
+ if (expr->IsUninitialized()) Add<HDeoptimize>(Deoptimizer::SOFT); |
return BuildStoreNamed(expr, expr->id(), expr->position(), |
expr->AssignmentId(), prop, object, value, value); |
} else { |
@@ -4946,7 +4942,7 @@ void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
&has_side_effects); |
Drop(3); |
Push(value); |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
return ast_context()->ReturnValue(Pop()); |
} |
} |
@@ -4975,14 +4971,14 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
} |
builder.Then(); |
builder.Else(); |
- AddSoftDeoptimize(MUST_EMIT_SOFT_DEOPT); |
+ Add<HDeoptimize>(Deoptimizer::EAGER); |
builder.End(); |
} |
HInstruction* instr = |
Add<HStoreGlobalCell>(value, cell, lookup.GetPropertyDetails()); |
instr->set_position(position); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
+ Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
} |
} else { |
HValue* context = environment()->LookupContext(); |
@@ -4992,7 +4988,7 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
value, function_strict_mode_flag()); |
instr->set_position(position); |
ASSERT(instr->HasObservableSideEffects()); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
+ Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
} |
} |
@@ -5054,7 +5050,7 @@ void HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr, |
instr->set_position(position); |
AddInstruction(instr); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(id, REMOVABLE_SIMULATE); |
+ Add<HSimulate>(id, REMOVABLE_SIMULATE); |
} |
if (!ast_context()->IsEffect()) Drop(1); |
return ast_context()->ReturnValue(result_value); |
@@ -5132,7 +5128,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
mode, Top()); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
break; |
} |
@@ -5173,7 +5169,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
if (load == NULL) load = BuildLoadNamedGeneric(object, name, prop); |
PushAndAdd(load); |
if (load->HasObservableSideEffects()) { |
- AddSimulate(prop->LoadId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(prop->LoadId(), REMOVABLE_SIMULATE); |
} |
CHECK_ALIVE(VisitForValue(expr->value())); |
@@ -5183,7 +5179,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
HInstruction* instr = BuildBinaryOperation(operation, left, right); |
PushAndAdd(instr); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(operation->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(operation->id(), REMOVABLE_SIMULATE); |
} |
return BuildStoreNamed(prop, expr->id(), expr->position(), |
@@ -5201,7 +5197,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
false, // is_store |
&has_side_effects); |
Push(load); |
- if (has_side_effects) AddSimulate(prop->LoadId(), REMOVABLE_SIMULATE); |
+ if (has_side_effects) Add<HSimulate>(prop->LoadId(), REMOVABLE_SIMULATE); |
CHECK_ALIVE(VisitForValue(expr->value())); |
HValue* right = Pop(); |
@@ -5210,7 +5206,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
HInstruction* instr = BuildBinaryOperation(operation, left, right); |
PushAndAdd(instr); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(operation->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(operation->id(), REMOVABLE_SIMULATE); |
} |
HandleKeyedElementAccess(obj, key, instr, expr, expr->AssignmentId(), |
@@ -5222,7 +5218,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
Drop(3); |
Push(instr); |
ASSERT(has_side_effects); // Stores always have side effects. |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
return ast_context()->ReturnValue(Pop()); |
} |
@@ -5344,7 +5340,7 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { |
HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
mode, Top()); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
return ast_context()->ReturnValue(Pop()); |
} |
@@ -5378,7 +5374,7 @@ void HOptimizedGraphBuilder::VisitThrow(Throw* expr) { |
HValue* value = environment()->Pop(); |
HThrow* instr = Add<HThrow>(context, value); |
instr->set_position(expr->position()); |
- AddSimulate(expr->id()); |
+ Add<HSimulate>(expr->id()); |
current_block()->FinishExit(new(zone()) HAbnormalExit); |
set_current_block(NULL); |
} |
@@ -5410,7 +5406,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedGeneric( |
Handle<String> name, |
Property* expr) { |
if (expr->IsUninitialized()) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
HValue* context = environment()->LookupContext(); |
return new(zone()) HLoadNamedGeneric(context, object, name); |
@@ -5732,7 +5728,8 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
} |
// Deopt if none of the cases matched. |
- current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); |
+ NoObservableSideEffectsScope scope(this); |
+ FinishExitWithHardDeoptimization(join); |
set_current_block(join); |
return is_store ? NULL : Pop(); |
} |
@@ -5768,12 +5765,12 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
} else { |
if (is_store) { |
if (expr->IsAssignment() && expr->AsAssignment()->IsUninitialized()) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
instr = BuildStoreKeyedGeneric(obj, key, val); |
} else { |
if (expr->AsProperty()->IsUninitialized()) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
} |
instr = BuildLoadKeyedGeneric(obj, key); |
} |
@@ -5952,10 +5949,10 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) { |
&has_side_effects); |
if (has_side_effects) { |
if (ast_context()->IsEffect()) { |
- AddSimulate(expr->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
} else { |
Push(load); |
- AddSimulate(expr->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
Drop(1); |
} |
} |
@@ -6057,7 +6054,7 @@ bool HOptimizedGraphBuilder::TryCallPolymorphicAsMonomorphic( |
PreProcessCall(call); |
AddInstruction(call); |
if (!ast_context()->IsEffect()) Push(call); |
- AddSimulate(expr->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); |
} |
@@ -6189,7 +6186,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( |
// know about and do not want to handle ones we've never seen. Otherwise |
// use a generic IC. |
if (ordered_functions == types->length() && FLAG_deoptimize_uncommon_cases) { |
- current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); |
+ FinishExitWithHardDeoptimization(join); |
} else { |
HValue* context = environment()->LookupContext(); |
HCallNamed* call = new(zone()) HCallNamed(context, name, argument_count); |
@@ -6447,7 +6444,7 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind, |
inner_env->BindContext(context); |
#endif |
- AddSimulate(return_id); |
+ Add<HSimulate>(return_id); |
current_block()->UpdateEnvironment(inner_env); |
HArgumentsObject* arguments_object = NULL; |
@@ -7625,7 +7622,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
HStoreContextSlot* instr = Add<HStoreContextSlot>(context, var->index(), |
mode, after); |
if (instr->HasObservableSideEffects()) { |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
break; |
} |
@@ -7668,7 +7665,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
if (load == NULL) load = BuildLoadNamedGeneric(object, name, prop); |
PushAndAdd(load); |
if (load->HasObservableSideEffects()) { |
- AddSimulate(prop->LoadId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(prop->LoadId(), REMOVABLE_SIMULATE); |
} |
after = BuildIncrement(returns_original_input, expr); |
@@ -7691,7 +7688,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
false, // is_store |
&has_side_effects); |
Push(load); |
- if (has_side_effects) AddSimulate(prop->LoadId(), REMOVABLE_SIMULATE); |
+ if (has_side_effects) Add<HSimulate>(prop->LoadId(), REMOVABLE_SIMULATE); |
after = BuildIncrement(returns_original_input, expr); |
input = environment()->ExpressionStackAt(0); |
@@ -7708,7 +7705,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
environment()->SetExpressionStackAt(0, after); |
if (returns_original_input) environment()->SetExpressionStackAt(1, input); |
ASSERT(has_side_effects); // Stores always have side effects. |
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(expr->AssignmentId(), REMOVABLE_SIMULATE); |
} |
} |
@@ -7814,12 +7811,12 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
Representation result_rep = Representation::FromType(result_type); |
if (left_type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
// TODO(rossberg): we should be able to get rid of non-continuous defaults. |
left_type = handle(Type::Any(), isolate()); |
} |
if (right_type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
right_type = handle(Type::Any(), isolate()); |
} |
HInstruction* instr = NULL; |
@@ -8169,7 +8166,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
// Cases handled below depend on collected type feedback. They should |
// soft deoptimize when there is no type feedback. |
if (combined_type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
+ Add<HDeoptimize>(Deoptimizer::SOFT); |
combined_type = left_type = right_type = handle(Type::Any(), isolate()); |
} |
@@ -8672,7 +8669,7 @@ void HOptimizedGraphBuilder::VisitVariableDeclaration( |
HStoreContextSlot* store = Add<HStoreContextSlot>( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
if (store->HasObservableSideEffects()) { |
- AddSimulate(proxy->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(proxy->id(), REMOVABLE_SIMULATE); |
} |
} |
break; |
@@ -8710,7 +8707,7 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration( |
HStoreContextSlot* store = Add<HStoreContextSlot>( |
context, variable->index(), HStoreContextSlot::kNoCheck, value); |
if (store->HasObservableSideEffects()) { |
- AddSimulate(proxy->id(), REMOVABLE_SIMULATE); |
+ Add<HSimulate>(proxy->id(), REMOVABLE_SIMULATE); |
} |
break; |
} |