Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 6fff1459bbca3b7bfd1d75d6f217341e8e0ca134..b24444b31cc5a1f52bd905a2a02ef09088cf16eb 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -720,26 +720,6 @@ HGraphBuilder::IfBuilder::IfBuilder( |
| } |
| -HInstruction* HGraphBuilder::IfBuilder::IfCompare( |
| - HValue* left, |
| - HValue* right, |
| - Token::Value token) { |
| - HCompareIDAndBranch* compare = |
| - new(zone()) HCompareIDAndBranch(left, right, token); |
| - AddCompare(compare); |
| - return compare; |
| -} |
| - |
| - |
| -HInstruction* HGraphBuilder::IfBuilder::IfCompareMap(HValue* left, |
| - Handle<Map> map) { |
| - HCompareMap* compare = |
| - new(zone()) HCompareMap(left, map, first_true_block_, first_false_block_); |
| - AddCompare(compare); |
| - return compare; |
| -} |
| - |
| - |
| void HGraphBuilder::IfBuilder::AddCompare(HControlInstruction* compare) { |
| if (split_edge_merge_block_ != NULL) { |
| HEnvironment* env = first_false_block_->last_environment(); |
| @@ -820,8 +800,8 @@ void HGraphBuilder::IfBuilder::Then() { |
| ToBooleanStub::Types boolean_type = ToBooleanStub::Types(); |
| boolean_type.Add(ToBooleanStub::BOOLEAN); |
| HBranch* branch = |
| - new(zone()) HBranch(constant_false, first_true_block_, |
| - first_false_block_, boolean_type); |
| + new(zone()) HBranch(constant_false, boolean_type, first_true_block_, |
| + first_false_block_); |
| builder_->current_block()->Finish(branch); |
| } |
| builder_->set_current_block(first_true_block_); |
| @@ -925,8 +905,8 @@ HValue* HGraphBuilder::LoopBuilder::BeginBody( |
| body_env->Pop(); |
| builder_->set_current_block(header_block_); |
| - HCompareIDAndBranch* compare = |
| - new(zone()) HCompareIDAndBranch(phi_, terminating, token); |
| + HCompareNumericAndBranch* compare = |
| + new(zone()) HCompareNumericAndBranch(phi_, terminating, token); |
| compare->SetSuccessorAt(0, body_block_); |
| compare->SetSuccessorAt(1, exit_block_); |
| builder_->current_block()->Finish(compare); |
| @@ -1140,14 +1120,15 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
| Zone* zone = this->zone(); |
| IfBuilder length_checker(this); |
| - length_checker.IfCompare(length, key, Token::EQ); |
| + length_checker.If<HCompareNumericAndBranch>(length, key, Token::EQ); |
| length_checker.Then(); |
| HValue* current_capacity = Add<HFixedArrayBaseLength>(elements); |
| IfBuilder capacity_checker(this); |
| - capacity_checker.IfCompare(length, current_capacity, Token::EQ); |
| + capacity_checker.If<HCompareNumericAndBranch>(length, current_capacity, |
| + Token::EQ); |
| capacity_checker.Then(); |
| HValue* context = environment()->LookupContext(); |
| @@ -1195,8 +1176,8 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object, |
| IfBuilder cow_checker(this); |
| - cow_checker.IfCompareMap(elements, |
| - Handle<Map>(heap->fixed_cow_array_map())); |
| + cow_checker.If<HCompareMap>(elements, |
| + Handle<Map>(heap->fixed_cow_array_map())); |
|
Michael Starzinger
2013/07/01 12:30:39
nit: Use factory->fixed_cow_array_map() instead.
danno
2013/07/05 09:52:39
Done.
|
| cow_checker.Then(); |
| HValue* capacity = Add<HFixedArrayBaseLength>(elements); |
| @@ -1265,10 +1246,10 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
| HLoadExternalArrayPointer* external_elements = |
| Add<HLoadExternalArrayPointer>(elements); |
| IfBuilder length_checker(this); |
| - length_checker.IfCompare(key, length, Token::LT); |
| + length_checker.If<HCompareNumericAndBranch>(key, length, Token::LT); |
| length_checker.Then(); |
| IfBuilder negative_checker(this); |
| - HValue* bounds_check = negative_checker.IfCompare( |
| + HValue* bounds_check = negative_checker.If<HCompareNumericAndBranch>( |
| key, graph()->GetConstant0(), Token::GTE); |
| negative_checker.Then(); |
| HInstruction* result = BuildExternalArrayElementAccess( |
| @@ -2593,7 +2574,7 @@ class HRangeAnalysis BASE_EMBEDDED { |
| private: |
| void TraceRange(const char* msg, ...); |
| void Analyze(HBasicBlock* block); |
| - void InferControlFlowRange(HCompareIDAndBranch* test, HBasicBlock* dest); |
| + void InferControlFlowRange(HCompareNumericAndBranch* test, HBasicBlock* dest); |
| void UpdateControlFlowRange(Token::Value op, HValue* value, HValue* other); |
| void InferRange(HValue* value); |
| void RollBackTo(int index); |
| @@ -2629,8 +2610,8 @@ void HRangeAnalysis::Analyze(HBasicBlock* block) { |
| // Infer range based on control flow. |
| if (block->predecessors()->length() == 1) { |
| HBasicBlock* pred = block->predecessors()->first(); |
| - if (pred->end()->IsCompareIDAndBranch()) { |
| - InferControlFlowRange(HCompareIDAndBranch::cast(pred->end()), block); |
| + if (pred->end()->IsCompareNumericAndBranch()) { |
| + InferControlFlowRange(HCompareNumericAndBranch::cast(pred->end()), block); |
| } |
| } |
| @@ -2656,7 +2637,7 @@ void HRangeAnalysis::Analyze(HBasicBlock* block) { |
| } |
| -void HRangeAnalysis::InferControlFlowRange(HCompareIDAndBranch* test, |
| +void HRangeAnalysis::InferControlFlowRange(HCompareNumericAndBranch* test, |
| HBasicBlock* dest) { |
| ASSERT((test->FirstSuccessor() == dest) == (test->SecondSuccessor() != dest)); |
| if (test->representation().IsSmiOrInteger32()) { |
| @@ -3081,12 +3062,11 @@ void HGraph::RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi) { |
| void HGraph::MarkDeoptimizeOnUndefined() { |
| HPhase phase("H_MarkDeoptimizeOnUndefined", this); |
| - // Compute DeoptimizeOnUndefined flag for phis. |
| - // Any phi that can reach a use with DeoptimizeOnUndefined set must |
| - // have DeoptimizeOnUndefined set. Currently only HCompareIDAndBranch, with |
| - // double input representation, has this flag set. |
| - // The flag is used by HChange tagged->double, which must deoptimize |
| - // if one of its uses has this flag set. |
| + // Compute DeoptimizeOnUndefined flag for phis. Any phi that can reach a use |
| + // with DeoptimizeOnUndefined set must have DeoptimizeOnUndefined set. |
| + // Currently only HCompareNumericAndBranch, with double input representation, |
| + // has this flag set. The flag is used by HChange tagged->double, which must |
| + // deoptimize if one of its uses has this flag set. |
| for (int i = 0; i < phi_list()->length(); i++) { |
| HPhi* phi = phi_list()->at(i); |
| for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { |
| @@ -3610,7 +3590,7 @@ void TestContext::BuildBranch(HValue* value) { |
| HBasicBlock* empty_true = builder->graph()->CreateBasicBlock(); |
| HBasicBlock* empty_false = builder->graph()->CreateBasicBlock(); |
| ToBooleanStub::Types expected(condition()->to_boolean_types()); |
| - HBranch* test = new(zone()) HBranch(value, empty_true, empty_false, expected); |
| + HBranch* test = new(zone()) HBranch(value, expected, empty_true, empty_false); |
| builder->current_block()->Finish(test); |
| empty_true->Goto(if_true(), builder->function_state()); |
| @@ -4827,10 +4807,10 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
| AddSoftDeoptimize(); |
| } |
| - HCompareIDAndBranch* compare_ = |
| - new(zone()) HCompareIDAndBranch(tag_value, |
| - label_value, |
| - Token::EQ_STRICT); |
| + HCompareNumericAndBranch* compare_ = |
| + new(zone()) HCompareNumericAndBranch(tag_value, |
| + label_value, |
| + Token::EQ_STRICT); |
| compare_->set_observed_input_representation( |
| Representation::Smi(), Representation::Smi()); |
| compare = compare_; |
| @@ -4935,7 +4915,8 @@ bool HOptimizedGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
| HBasicBlock* non_osr_entry = graph()->CreateBasicBlock(); |
| HBasicBlock* osr_entry = graph()->CreateBasicBlock(); |
| HValue* true_value = graph()->GetConstantTrue(); |
| - HBranch* test = new(zone()) HBranch(true_value, non_osr_entry, osr_entry); |
| + HBranch* test = new(zone()) HBranch(true_value, ToBooleanStub::Types(), |
| + non_osr_entry, osr_entry); |
| current_block()->Finish(test); |
| HBasicBlock* loop_predecessor = graph()->CreateBasicBlock(); |
| @@ -5184,8 +5165,8 @@ void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
| HValue* limit = environment()->ExpressionStackAt(1); |
| // Check that we still have more keys. |
| - HCompareIDAndBranch* compare_index = |
| - new(zone()) HCompareIDAndBranch(index, limit, Token::LT); |
| + HCompareNumericAndBranch* compare_index = |
| + new(zone()) HCompareNumericAndBranch(index, limit, Token::LT); |
| compare_index->set_observed_input_representation( |
| Representation::Smi(), Representation::Smi()); |
| @@ -6240,7 +6221,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |
| HBasicBlock* if_true = graph()->CreateBasicBlock(); |
| HBasicBlock* if_false = graph()->CreateBasicBlock(); |
| HCompareMap* compare = |
| - new(zone()) HCompareMap(object, map, if_true, if_false); |
| + new(zone()) HCompareMap(object, map, if_true, if_false); |
| current_block()->Finish(compare); |
| set_current_block(if_true); |
| @@ -6345,7 +6326,7 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
| IfBuilder builder(this); |
| HValue* constant = Add<HConstant>(cell->type()->AsConstant()); |
| if (cell->type()->AsConstant()->IsNumber()) { |
| - builder.IfCompare(value, constant, Token::EQ); |
| + builder.If<HCompareNumericAndBranch>(value, constant, Token::EQ); |
| } else { |
| builder.If<HCompareObjectEqAndBranch>(value, constant); |
| } |
| @@ -9329,8 +9310,8 @@ void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
| HBasicBlock* eval_right = graph()->CreateBasicBlock(); |
| ToBooleanStub::Types expected(expr->left()->to_boolean_types()); |
| HBranch* test = is_logical_and |
| - ? new(zone()) HBranch(left_value, eval_right, empty_block, expected) |
| - : new(zone()) HBranch(left_value, empty_block, eval_right, expected); |
| + ? new(zone()) HBranch(left_value, expected, eval_right, empty_block) |
| + : new(zone()) HBranch(left_value, expected, empty_block, eval_right); |
| current_block()->Finish(test); |
| set_current_block(eval_right); |
| @@ -9637,8 +9618,8 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
| // the IC measures Smi. |
| if (left_type->Is(Type::Smi())) left_rep = Representation::Smi(); |
| if (right_type->Is(Type::Smi())) right_rep = Representation::Smi(); |
| - HCompareIDAndBranch* result = |
| - new(zone()) HCompareIDAndBranch(left, right, op); |
| + HCompareNumericAndBranch* result = |
| + new(zone()) HCompareNumericAndBranch(left, right, op); |
| result->set_observed_input_representation(left_rep, right_rep); |
| result->set_position(expr->position()); |
| return ast_context()->ReturnControl(result, expr->id()); |