| OLD | NEW |
| 1 // Copyright 2013 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 #define DEFINE_GET_CONSTANT(Name, name, htype, boolean_value) \ | 639 #define DEFINE_GET_CONSTANT(Name, name, htype, boolean_value) \ |
| 640 HConstant* HGraph::GetConstant##Name() { \ | 640 HConstant* HGraph::GetConstant##Name() { \ |
| 641 if (!constant_##name##_.is_set()) { \ | 641 if (!constant_##name##_.is_set()) { \ |
| 642 HConstant* constant = new(zone()) HConstant( \ | 642 HConstant* constant = new(zone()) HConstant( \ |
| 643 isolate()->factory()->name##_value(), \ | 643 isolate()->factory()->name##_value(), \ |
| 644 UniqueValueId(isolate()->heap()->name##_value()), \ | 644 UniqueValueId(isolate()->heap()->name##_value()), \ |
| 645 Representation::Tagged(), \ | 645 Representation::Tagged(), \ |
| 646 htype, \ | 646 htype, \ |
| 647 false, \ | 647 false, \ |
| 648 true, \ | 648 true, \ |
| 649 false, \ | |
| 650 boolean_value); \ | 649 boolean_value); \ |
| 651 constant->InsertAfter(GetConstantUndefined()); \ | 650 constant->InsertAfter(GetConstantUndefined()); \ |
| 652 constant_##name##_.set(constant); \ | 651 constant_##name##_.set(constant); \ |
| 653 } \ | 652 } \ |
| 654 return constant_##name##_.get(); \ | 653 return constant_##name##_.get(); \ |
| 655 } | 654 } |
| 656 | 655 |
| 657 | 656 |
| 658 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) | 657 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) |
| 659 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) | 658 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) |
| 660 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) | 659 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) |
| 661 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) | 660 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) |
| 662 | 661 |
| 663 | 662 |
| 664 #undef DEFINE_GET_CONSTANT | 663 #undef DEFINE_GET_CONSTANT |
| 665 | 664 |
| 666 | 665 |
| 667 HConstant* HGraph::GetInvalidContext() { | 666 HConstant* HGraph::GetInvalidContext() { |
| 668 return GetConstant(&constant_invalid_context_, 0xFFFFC0C7); | 667 return GetConstant(&constant_invalid_context_, 0xFFFFC0C7); |
| 669 } | 668 } |
| 670 | 669 |
| 671 | 670 |
| 672 bool HGraph::IsStandardConstant(HConstant* constant) { | |
| 673 if (constant == GetConstantUndefined()) return true; | |
| 674 if (constant == GetConstant0()) return true; | |
| 675 if (constant == GetConstant1()) return true; | |
| 676 if (constant == GetConstantMinus1()) return true; | |
| 677 if (constant == GetConstantTrue()) return true; | |
| 678 if (constant == GetConstantFalse()) return true; | |
| 679 if (constant == GetConstantHole()) return true; | |
| 680 if (constant == GetConstantNull()) return true; | |
| 681 return false; | |
| 682 } | |
| 683 | |
| 684 | |
| 685 HGraphBuilder::IfBuilder::IfBuilder(HGraphBuilder* builder, int position) | 671 HGraphBuilder::IfBuilder::IfBuilder(HGraphBuilder* builder, int position) |
| 686 : builder_(builder), | 672 : builder_(builder), |
| 687 position_(position), | 673 position_(position), |
| 688 finished_(false), | 674 finished_(false), |
| 689 did_then_(false), | 675 did_then_(false), |
| 690 did_else_(false), | 676 did_else_(false), |
| 691 did_and_(false), | 677 did_and_(false), |
| 692 did_or_(false), | 678 did_or_(false), |
| 693 captured_(false), | 679 captured_(false), |
| 694 needs_compare_(true), | 680 needs_compare_(true), |
| (...skipping 3759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4454 } | 4440 } |
| 4455 } | 4441 } |
| 4456 | 4442 |
| 4457 | 4443 |
| 4458 void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) { | 4444 void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) { |
| 4459 Push(instr); | 4445 Push(instr); |
| 4460 AddInstruction(instr); | 4446 AddInstruction(instr); |
| 4461 } | 4447 } |
| 4462 | 4448 |
| 4463 | 4449 |
| 4464 void HOptimizedGraphBuilder::AddSoftDeoptimize(SoftDeoptimizeMode mode) { | 4450 void HOptimizedGraphBuilder::AddSoftDeoptimize() { |
| 4465 isolate()->counters()->soft_deopts_requested()->Increment(); | 4451 isolate()->counters()->soft_deopts_requested()->Increment(); |
| 4466 if (FLAG_always_opt && mode == CAN_OMIT_SOFT_DEOPT) return; | 4452 if (FLAG_always_opt) return; |
| 4467 if (current_block()->IsDeoptimizing()) return; | 4453 if (current_block()->IsDeoptimizing()) return; |
| 4468 Add<HSoftDeoptimize>(); | 4454 Add<HSoftDeoptimize>(); |
| 4469 isolate()->counters()->soft_deopts_inserted()->Increment(); | 4455 isolate()->counters()->soft_deopts_inserted()->Increment(); |
| 4470 current_block()->MarkAsDeoptimizing(); | 4456 current_block()->MarkAsDeoptimizing(); |
| 4471 graph()->set_has_soft_deoptimize(true); | 4457 graph()->set_has_soft_deoptimize(true); |
| 4472 } | 4458 } |
| 4473 | 4459 |
| 4474 | 4460 |
| 4475 template <class Instruction> | 4461 template <class Instruction> |
| 4476 HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { | 4462 HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5409 LookupGlobalProperty(variable, &lookup, false); | 5395 LookupGlobalProperty(variable, &lookup, false); |
| 5410 | 5396 |
| 5411 if (type == kUseCell && | 5397 if (type == kUseCell && |
| 5412 current_info()->global_object()->IsAccessCheckNeeded()) { | 5398 current_info()->global_object()->IsAccessCheckNeeded()) { |
| 5413 type = kUseGeneric; | 5399 type = kUseGeneric; |
| 5414 } | 5400 } |
| 5415 | 5401 |
| 5416 if (type == kUseCell) { | 5402 if (type == kUseCell) { |
| 5417 Handle<GlobalObject> global(current_info()->global_object()); | 5403 Handle<GlobalObject> global(current_info()->global_object()); |
| 5418 Handle<PropertyCell> cell(global->GetPropertyCell(&lookup)); | 5404 Handle<PropertyCell> cell(global->GetPropertyCell(&lookup)); |
| 5419 if (cell->type()->IsConstant()) { | 5405 HLoadGlobalCell* instr = |
| 5420 cell->AddDependentCompilationInfo(top_info()); | 5406 new(zone()) HLoadGlobalCell(cell, lookup.GetPropertyDetails()); |
| 5421 Handle<Object> constant_object = cell->type()->AsConstant(); | 5407 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 5422 if (constant_object->IsConsString()) { | |
| 5423 constant_object = | |
| 5424 FlattenGetString(Handle<String>::cast(constant_object)); | |
| 5425 } | |
| 5426 HConstant* constant = new(zone()) HConstant(constant_object); | |
| 5427 return ast_context()->ReturnInstruction(constant, expr->id()); | |
| 5428 } else { | |
| 5429 HLoadGlobalCell* instr = | |
| 5430 new(zone()) HLoadGlobalCell(cell, lookup.GetPropertyDetails()); | |
| 5431 return ast_context()->ReturnInstruction(instr, expr->id()); | |
| 5432 } | |
| 5433 } else { | 5408 } else { |
| 5434 HValue* context = environment()->LookupContext(); | 5409 HValue* context = environment()->LookupContext(); |
| 5435 HGlobalObject* global_object = new(zone()) HGlobalObject(context); | 5410 HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
| 5436 AddInstruction(global_object); | 5411 AddInstruction(global_object); |
| 5437 HLoadGlobalGeneric* instr = | 5412 HLoadGlobalGeneric* instr = |
| 5438 new(zone()) HLoadGlobalGeneric(context, | 5413 new(zone()) HLoadGlobalGeneric(context, |
| 5439 global_object, | 5414 global_object, |
| 5440 variable->name(), | 5415 variable->name(), |
| 5441 ast_context()->is_for_typeof()); | 5416 ast_context()->is_for_typeof()); |
| 5442 instr->set_position(expr->position()); | 5417 instr->set_position(expr->position()); |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6329 void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( | 6304 void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
| 6330 Variable* var, | 6305 Variable* var, |
| 6331 HValue* value, | 6306 HValue* value, |
| 6332 int position, | 6307 int position, |
| 6333 BailoutId ast_id) { | 6308 BailoutId ast_id) { |
| 6334 LookupResult lookup(isolate()); | 6309 LookupResult lookup(isolate()); |
| 6335 GlobalPropertyAccess type = LookupGlobalProperty(var, &lookup, true); | 6310 GlobalPropertyAccess type = LookupGlobalProperty(var, &lookup, true); |
| 6336 if (type == kUseCell) { | 6311 if (type == kUseCell) { |
| 6337 Handle<GlobalObject> global(current_info()->global_object()); | 6312 Handle<GlobalObject> global(current_info()->global_object()); |
| 6338 Handle<PropertyCell> cell(global->GetPropertyCell(&lookup)); | 6313 Handle<PropertyCell> cell(global->GetPropertyCell(&lookup)); |
| 6339 if (cell->type()->IsConstant()) { | 6314 HInstruction* instr = Add<HStoreGlobalCell>(value, cell, |
| 6340 IfBuilder builder(this); | 6315 lookup.GetPropertyDetails()); |
| 6341 HValue* constant = Add<HConstant>(cell->type()->AsConstant()); | |
| 6342 if (cell->type()->AsConstant()->IsNumber()) { | |
| 6343 builder.IfCompare(value, constant, Token::EQ); | |
| 6344 } else { | |
| 6345 builder.If<HCompareObjectEqAndBranch>(value, constant); | |
| 6346 } | |
| 6347 builder.Then(); | |
| 6348 builder.Else(); | |
| 6349 AddSoftDeoptimize(MUST_EMIT_SOFT_DEOPT); | |
| 6350 builder.End(); | |
| 6351 } | |
| 6352 HInstruction* instr = | |
| 6353 Add<HStoreGlobalCell>(value, cell, lookup.GetPropertyDetails()); | |
| 6354 instr->set_position(position); | 6316 instr->set_position(position); |
| 6355 if (instr->HasObservableSideEffects()) { | 6317 if (instr->HasObservableSideEffects()) { |
| 6356 AddSimulate(ast_id, REMOVABLE_SIMULATE); | 6318 AddSimulate(ast_id, REMOVABLE_SIMULATE); |
| 6357 } | 6319 } |
| 6358 } else { | 6320 } else { |
| 6359 HValue* context = environment()->LookupContext(); | 6321 HValue* context = environment()->LookupContext(); |
| 6360 HGlobalObject* global_object = Add<HGlobalObject>(context); | 6322 HGlobalObject* global_object = Add<HGlobalObject>(context); |
| 6361 HStoreGlobalGeneric* instr = | 6323 HStoreGlobalGeneric* instr = |
| 6362 Add<HStoreGlobalGeneric>(context, global_object, var->name(), | 6324 Add<HStoreGlobalGeneric>(context, global_object, var->name(), |
| 6363 value, function_strict_mode_flag()); | 6325 value, function_strict_mode_flag()); |
| (...skipping 4918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11282 if (ShouldProduceTraceOutput()) { | 11244 if (ShouldProduceTraceOutput()) { |
| 11283 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11245 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11284 } | 11246 } |
| 11285 | 11247 |
| 11286 #ifdef DEBUG | 11248 #ifdef DEBUG |
| 11287 graph_->Verify(false); // No full verify. | 11249 graph_->Verify(false); // No full verify. |
| 11288 #endif | 11250 #endif |
| 11289 } | 11251 } |
| 11290 | 11252 |
| 11291 } } // namespace v8::internal | 11253 } } // namespace v8::internal |
| OLD | NEW |