Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index d3d7b5837a0c5e3d9a09ba4a58ce9486773818e8..2549c42fa0a31567a89661130f6527677639edac 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4375,7 +4375,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
HControlInstruction* compare = BuildCompareInstruction( |
Token::EQ_STRICT, tag_value, label_value, tag_type, label_type, |
combined_type, stmt->tag()->position(), clause->label()->position(), |
- clause->id()); |
+ PUSH_BEFORE_SIMULATE, clause->id()); |
HBasicBlock* next_test_block = graph()->CreateBasicBlock(); |
HBasicBlock* body_block = graph()->CreateBasicBlock(); |
@@ -9005,13 +9005,12 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation( |
// after phis, which are the result of BuildBinaryOperation when we |
// inlined some complex subgraph. |
if (result->HasObservableSideEffects() || result->IsPhi()) { |
- if (push_sim_result == NO_PUSH_BEFORE_SIMULATE) { |
- Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
- } else { |
- ASSERT(push_sim_result == PUSH_BEFORE_SIMULATE); |
+ if (push_sim_result == PUSH_BEFORE_SIMULATE) { |
Push(result); |
Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
Drop(1); |
+ } else { |
+ Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
} |
} |
return result; |
@@ -9527,9 +9526,13 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
return ast_context()->ReturnInstruction(result, expr->id()); |
} |
+ PushBeforeSimulateBehavior push_behavior = |
+ ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE |
+ : PUSH_BEFORE_SIMULATE; |
HControlInstruction* compare = BuildCompareInstruction( |
op, left, right, left_type, right_type, combined_type, |
- expr->left()->position(), expr->right()->position(), expr->id()); |
+ expr->left()->position(), expr->right()->position(), |
+ push_behavior, expr->id()); |
if (compare == NULL) return; // Bailed out. |
return ast_context()->ReturnControl(compare, expr->id()); |
} |
@@ -9544,6 +9547,7 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction( |
Type* combined_type, |
int left_position, |
int right_position, |
+ PushBeforeSimulateBehavior push_sim_result, |
BailoutId bailout_id) { |
// Cases handled below depend on collected type feedback. They should |
// soft deoptimize when there is no type feedback. |
@@ -9608,9 +9612,13 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction( |
result->set_observed_input_representation(1, left_rep); |
result->set_observed_input_representation(2, right_rep); |
if (result->HasObservableSideEffects()) { |
- Push(result); |
- AddSimulate(bailout_id, REMOVABLE_SIMULATE); |
- Drop(1); |
+ if (push_sim_result == PUSH_BEFORE_SIMULATE) { |
+ Push(result); |
+ AddSimulate(bailout_id, REMOVABLE_SIMULATE); |
+ Drop(1); |
+ } else { |
+ AddSimulate(bailout_id, REMOVABLE_SIMULATE); |
+ } |
} |
// TODO(jkummerow): Can we make this more efficient? |
HBranch* branch = New<HBranch>(result); |