| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3520 HValue* use = it.value(); | 3520 HValue* use = it.value(); |
| 3521 if (use->IsPhi()) { | 3521 if (use->IsPhi()) { |
| 3522 int id = HPhi::cast(use)->phi_id(); | 3522 int id = HPhi::cast(use)->phi_id(); |
| 3523 if (connected_phis[i]->UnionIsChanged(*connected_phis[id])) | 3523 if (connected_phis[i]->UnionIsChanged(*connected_phis[id])) |
| 3524 change = true; | 3524 change = true; |
| 3525 } | 3525 } |
| 3526 } | 3526 } |
| 3527 } | 3527 } |
| 3528 } | 3528 } |
| 3529 | 3529 |
| 3530 // (3a) Use the phi reachability information from step 2 to | 3530 // Simplify constant phi inputs where possible. |
| 3531 for (int i = 0; i < phi_count; ++i) { |
| 3532 phi_list->at(i)->SimplifyConstantInputs(); |
| 3533 } |
| 3534 |
| 3535 // Use the phi reachability information from step 2 to |
| 3531 // push information about values which can't be converted to integer | 3536 // push information about values which can't be converted to integer |
| 3532 // without deoptimization through the phi use-def chains, avoiding | 3537 // without deoptimization through the phi use-def chains, avoiding |
| 3533 // unnecessary deoptimizations later. | 3538 // unnecessary deoptimizations later. |
| 3534 for (int i = 0; i < phi_count; ++i) { | 3539 for (int i = 0; i < phi_count; ++i) { |
| 3535 HPhi* phi = phi_list->at(i); | 3540 HPhi* phi = phi_list->at(i); |
| 3536 bool cti = phi->AllOperandsConvertibleToInteger(); | 3541 bool cti = phi->AllOperandsConvertibleToInteger(); |
| 3537 if (cti) continue; | 3542 if (cti) continue; |
| 3538 | 3543 |
| 3539 for (BitVector::Iterator it(connected_phis.at(i)); | 3544 for (BitVector::Iterator it(connected_phis.at(i)); |
| 3540 !it.Done(); | 3545 !it.Done(); |
| 3541 it.Advance()) { | 3546 it.Advance()) { |
| 3542 HPhi* phi = phi_list->at(it.Current()); | 3547 HPhi* phi = phi_list->at(it.Current()); |
| 3543 phi->set_is_convertible_to_integer(false); | 3548 phi->set_is_convertible_to_integer(false); |
| 3544 } | 3549 } |
| 3545 } | 3550 } |
| 3546 | 3551 |
| 3547 // (3b) Use the phi reachability information from step 2 to | 3552 // Use the phi reachability information from step 2 to |
| 3548 // sum up the non-phi use counts of all connected phis. | 3553 // sum up the non-phi use counts of all connected phis. |
| 3549 for (int i = 0; i < phi_count; ++i) { | 3554 for (int i = 0; i < phi_count; ++i) { |
| 3550 HPhi* phi = phi_list->at(i); | 3555 HPhi* phi = phi_list->at(i); |
| 3551 for (BitVector::Iterator it(connected_phis.at(i)); | 3556 for (BitVector::Iterator it(connected_phis.at(i)); |
| 3552 !it.Done(); | 3557 !it.Done(); |
| 3553 it.Advance()) { | 3558 it.Advance()) { |
| 3554 int index = it.Current(); | 3559 int index = it.Current(); |
| 3555 HPhi* it_use = phi_list->at(index); | 3560 HPhi* it_use = phi_list->at(index); |
| 3556 if (index != i) phi->AddNonPhiUsesFrom(it_use); // Don't count twice. | 3561 if (index != i) phi->AddNonPhiUsesFrom(it_use); // Don't count twice. |
| 3557 } | 3562 } |
| (...skipping 5889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9447 HValue* context = environment()->LookupContext(); | 9452 HValue* context = environment()->LookupContext(); |
| 9448 HInstruction* instr = | 9453 HInstruction* instr = |
| 9449 HMul::New(zone(), context, value, graph()->GetConstantMinus1()); | 9454 HMul::New(zone(), context, value, graph()->GetConstantMinus1()); |
| 9450 TypeInfo info = oracle()->UnaryType(expr); | 9455 TypeInfo info = oracle()->UnaryType(expr); |
| 9451 Representation rep = ToRepresentation(info); | 9456 Representation rep = ToRepresentation(info); |
| 9452 if (info.IsUninitialized()) { | 9457 if (info.IsUninitialized()) { |
| 9453 AddSoftDeoptimize(); | 9458 AddSoftDeoptimize(); |
| 9454 info = TypeInfo::Unknown(); | 9459 info = TypeInfo::Unknown(); |
| 9455 } | 9460 } |
| 9456 if (instr->IsBinaryOperation()) { | 9461 if (instr->IsBinaryOperation()) { |
| 9457 HBinaryOperation::cast(instr)->set_observed_input_representation(rep, rep); | 9462 HBinaryOperation::cast(instr)->set_observed_input_representation(1, rep); |
| 9463 HBinaryOperation::cast(instr)->set_observed_input_representation(2, rep); |
| 9458 } | 9464 } |
| 9459 return ast_context()->ReturnInstruction(instr, expr->id()); | 9465 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 9460 } | 9466 } |
| 9461 | 9467 |
| 9462 | 9468 |
| 9463 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { | 9469 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| 9464 CHECK_ALIVE(VisitForValue(expr->expression())); | 9470 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 9465 HValue* value = Pop(); | 9471 HValue* value = Pop(); |
| 9466 TypeInfo info = oracle()->UnaryType(expr); | 9472 TypeInfo info = oracle()->UnaryType(expr); |
| 9467 if (info.IsUninitialized()) { | 9473 if (info.IsUninitialized()) { |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9888 break; | 9894 break; |
| 9889 case Token::SHL: | 9895 case Token::SHL: |
| 9890 instr = HShl::New(zone(), context, left, right); | 9896 instr = HShl::New(zone(), context, left, right); |
| 9891 break; | 9897 break; |
| 9892 default: | 9898 default: |
| 9893 UNREACHABLE(); | 9899 UNREACHABLE(); |
| 9894 } | 9900 } |
| 9895 | 9901 |
| 9896 if (instr->IsBinaryOperation()) { | 9902 if (instr->IsBinaryOperation()) { |
| 9897 HBinaryOperation* binop = HBinaryOperation::cast(instr); | 9903 HBinaryOperation* binop = HBinaryOperation::cast(instr); |
| 9898 binop->set_observed_input_representation(left_rep, right_rep); | 9904 binop->set_observed_input_representation(1, left_rep); |
| 9905 binop->set_observed_input_representation(2, right_rep); |
| 9899 binop->initialize_output_representation(result_rep); | 9906 binop->initialize_output_representation(result_rep); |
| 9900 } | 9907 } |
| 9901 return instr; | 9908 return instr; |
| 9902 } | 9909 } |
| 9903 | 9910 |
| 9904 | 9911 |
| 9905 // Check for the form (%_ClassOf(foo) === 'BarClass'). | 9912 // Check for the form (%_ClassOf(foo) === 'BarClass'). |
| 9906 static bool IsClassOfTest(CompareOperation* expr) { | 9913 static bool IsClassOfTest(CompareOperation* expr) { |
| 9907 if (expr->op() != Token::EQ_STRICT) return false; | 9914 if (expr->op() != Token::EQ_STRICT) return false; |
| 9908 CallRuntime* call = expr->left()->AsCallRuntime(); | 9915 CallRuntime* call = expr->left()->AsCallRuntime(); |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10268 AddInstruction(new(zone()) HCheckNonSmi(right)); | 10275 AddInstruction(new(zone()) HCheckNonSmi(right)); |
| 10269 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); | 10276 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); |
| 10270 HCompareObjectEqAndBranch* result = | 10277 HCompareObjectEqAndBranch* result = |
| 10271 new(zone()) HCompareObjectEqAndBranch(left, right); | 10278 new(zone()) HCompareObjectEqAndBranch(left, right); |
| 10272 result->set_position(expr->position()); | 10279 result->set_position(expr->position()); |
| 10273 return ast_context()->ReturnControl(result, expr->id()); | 10280 return ast_context()->ReturnControl(result, expr->id()); |
| 10274 } else { | 10281 } else { |
| 10275 if (combined_rep.IsTagged() || combined_rep.IsNone()) { | 10282 if (combined_rep.IsTagged() || combined_rep.IsNone()) { |
| 10276 HCompareGeneric* result = | 10283 HCompareGeneric* result = |
| 10277 new(zone()) HCompareGeneric(context, left, right, op); | 10284 new(zone()) HCompareGeneric(context, left, right, op); |
| 10278 result->set_observed_input_representation(left_rep, right_rep); | 10285 result->set_observed_input_representation(1, left_rep); |
| 10286 result->set_observed_input_representation(2, right_rep); |
| 10279 result->set_position(expr->position()); | 10287 result->set_position(expr->position()); |
| 10280 return ast_context()->ReturnInstruction(result, expr->id()); | 10288 return ast_context()->ReturnInstruction(result, expr->id()); |
| 10281 } else { | 10289 } else { |
| 10282 HCompareIDAndBranch* result = | 10290 HCompareIDAndBranch* result = |
| 10283 new(zone()) HCompareIDAndBranch(left, right, op); | 10291 new(zone()) HCompareIDAndBranch(left, right, op); |
| 10284 result->set_observed_input_representation(left_rep, right_rep); | 10292 result->set_observed_input_representation(left_rep, right_rep); |
| 10285 result->set_position(expr->position()); | 10293 result->set_position(expr->position()); |
| 10286 return ast_context()->ReturnControl(result, expr->id()); | 10294 return ast_context()->ReturnControl(result, expr->id()); |
| 10287 } | 10295 } |
| 10288 } | 10296 } |
| (...skipping 1630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11919 } | 11927 } |
| 11920 } | 11928 } |
| 11921 | 11929 |
| 11922 #ifdef DEBUG | 11930 #ifdef DEBUG |
| 11923 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 11931 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 11924 if (allocator_ != NULL) allocator_->Verify(); | 11932 if (allocator_ != NULL) allocator_->Verify(); |
| 11925 #endif | 11933 #endif |
| 11926 } | 11934 } |
| 11927 | 11935 |
| 11928 } } // namespace v8::internal | 11936 } } // namespace v8::internal |
| OLD | NEW |