| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 2637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2648 ASSERT(!instr->IsControlInstruction()); | 2648 ASSERT(!instr->IsControlInstruction()); |
| 2649 owner()->AddInstruction(instr); | 2649 owner()->AddInstruction(instr); |
| 2650 if (instr->HasObservableSideEffects()) { | 2650 if (instr->HasObservableSideEffects()) { |
| 2651 owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); | 2651 owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
| 2652 } | 2652 } |
| 2653 } | 2653 } |
| 2654 | 2654 |
| 2655 | 2655 |
| 2656 void EffectContext::ReturnControl(HControlInstruction* instr, | 2656 void EffectContext::ReturnControl(HControlInstruction* instr, |
| 2657 BailoutId ast_id) { | 2657 BailoutId ast_id) { |
| 2658 ASSERT(!instr->HasObservableSideEffects()); |
| 2658 HBasicBlock* empty_true = owner()->graph()->CreateBasicBlock(); | 2659 HBasicBlock* empty_true = owner()->graph()->CreateBasicBlock(); |
| 2659 HBasicBlock* empty_false = owner()->graph()->CreateBasicBlock(); | 2660 HBasicBlock* empty_false = owner()->graph()->CreateBasicBlock(); |
| 2660 instr->SetSuccessorAt(0, empty_true); | 2661 instr->SetSuccessorAt(0, empty_true); |
| 2661 instr->SetSuccessorAt(1, empty_false); | 2662 instr->SetSuccessorAt(1, empty_false); |
| 2662 owner()->current_block()->Finish(instr); | 2663 owner()->current_block()->Finish(instr); |
| 2663 HBasicBlock* join = owner()->CreateJoin(empty_true, empty_false, ast_id); | 2664 HBasicBlock* join = owner()->CreateJoin(empty_true, empty_false, ast_id); |
| 2664 owner()->set_current_block(join); | 2665 owner()->set_current_block(join); |
| 2665 } | 2666 } |
| 2666 | 2667 |
| 2667 | 2668 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2688 } | 2689 } |
| 2689 owner()->AddInstruction(instr); | 2690 owner()->AddInstruction(instr); |
| 2690 owner()->Push(instr); | 2691 owner()->Push(instr); |
| 2691 if (instr->HasObservableSideEffects()) { | 2692 if (instr->HasObservableSideEffects()) { |
| 2692 owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); | 2693 owner()->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
| 2693 } | 2694 } |
| 2694 } | 2695 } |
| 2695 | 2696 |
| 2696 | 2697 |
| 2697 void ValueContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) { | 2698 void ValueContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) { |
| 2699 ASSERT(!instr->HasObservableSideEffects()); |
| 2698 if (!arguments_allowed() && instr->CheckFlag(HValue::kIsArguments)) { | 2700 if (!arguments_allowed() && instr->CheckFlag(HValue::kIsArguments)) { |
| 2699 return owner()->Bailout(kBadValueContextForArgumentsObjectValue); | 2701 return owner()->Bailout(kBadValueContextForArgumentsObjectValue); |
| 2700 } | 2702 } |
| 2701 HBasicBlock* materialize_false = owner()->graph()->CreateBasicBlock(); | 2703 HBasicBlock* materialize_false = owner()->graph()->CreateBasicBlock(); |
| 2702 HBasicBlock* materialize_true = owner()->graph()->CreateBasicBlock(); | 2704 HBasicBlock* materialize_true = owner()->graph()->CreateBasicBlock(); |
| 2703 instr->SetSuccessorAt(0, materialize_true); | 2705 instr->SetSuccessorAt(0, materialize_true); |
| 2704 instr->SetSuccessorAt(1, materialize_false); | 2706 instr->SetSuccessorAt(1, materialize_false); |
| 2705 owner()->current_block()->Finish(instr); | 2707 owner()->current_block()->Finish(instr); |
| 2706 owner()->set_current_block(materialize_true); | 2708 owner()->set_current_block(materialize_true); |
| 2707 owner()->Push(owner()->graph()->GetConstantTrue()); | 2709 owner()->Push(owner()->graph()->GetConstantTrue()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2745 if (instr->HasObservableSideEffects()) { | 2747 if (instr->HasObservableSideEffects()) { |
| 2746 builder->Push(instr); | 2748 builder->Push(instr); |
| 2747 builder->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); | 2749 builder->Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
| 2748 builder->Pop(); | 2750 builder->Pop(); |
| 2749 } | 2751 } |
| 2750 BuildBranch(instr); | 2752 BuildBranch(instr); |
| 2751 } | 2753 } |
| 2752 | 2754 |
| 2753 | 2755 |
| 2754 void TestContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) { | 2756 void TestContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) { |
| 2755 // We can ignore ObservableSideEffects here since both HGoto instructions | 2757 ASSERT(!instr->HasObservableSideEffects()); |
| 2756 // insert a different Simulate, thus we will directly deoptimize into the | |
| 2757 // correct branch. | |
| 2758 HBasicBlock* empty_true = owner()->graph()->CreateBasicBlock(); | 2758 HBasicBlock* empty_true = owner()->graph()->CreateBasicBlock(); |
| 2759 HBasicBlock* empty_false = owner()->graph()->CreateBasicBlock(); | 2759 HBasicBlock* empty_false = owner()->graph()->CreateBasicBlock(); |
| 2760 instr->SetSuccessorAt(0, empty_true); | 2760 instr->SetSuccessorAt(0, empty_true); |
| 2761 instr->SetSuccessorAt(1, empty_false); | 2761 instr->SetSuccessorAt(1, empty_false); |
| 2762 owner()->current_block()->Finish(instr); | 2762 owner()->current_block()->Finish(instr); |
| 2763 empty_true->Goto(if_true(), owner()->function_state()); | 2763 empty_true->Goto(if_true(), owner()->function_state()); |
| 2764 empty_false->Goto(if_false(), owner()->function_state()); | 2764 empty_false->Goto(if_false(), owner()->function_state()); |
| 2765 owner()->set_current_block(NULL); | 2765 owner()->set_current_block(NULL); |
| 2766 } | 2766 } |
| 2767 | 2767 |
| (...skipping 5426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8194 BuildCheckHeapObject(left); | 8194 BuildCheckHeapObject(left); |
| 8195 AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); | 8195 AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); |
| 8196 BuildCheckHeapObject(right); | 8196 BuildCheckHeapObject(right); |
| 8197 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); | 8197 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); |
| 8198 HCompareObjectEqAndBranch* result = | 8198 HCompareObjectEqAndBranch* result = |
| 8199 New<HCompareObjectEqAndBranch>(left, right); | 8199 New<HCompareObjectEqAndBranch>(left, right); |
| 8200 result->set_position(expr->position()); | 8200 result->set_position(expr->position()); |
| 8201 return ast_context()->ReturnControl(result, expr->id()); | 8201 return ast_context()->ReturnControl(result, expr->id()); |
| 8202 } else { | 8202 } else { |
| 8203 if (combined_rep.IsTagged() || combined_rep.IsNone()) { | 8203 if (combined_rep.IsTagged() || combined_rep.IsNone()) { |
| 8204 HCompareGenericAndBranch* result = | 8204 HCompareGeneric* result = |
| 8205 New<HCompareGenericAndBranch>(left, right, op); | 8205 new(zone()) HCompareGeneric(context, left, right, op); |
| 8206 result->set_observed_input_representation(left_rep, right_rep); | 8206 result->set_observed_input_representation(1, left_rep); |
| 8207 result->set_observed_input_representation(2, right_rep); |
| 8207 result->set_position(expr->position()); | 8208 result->set_position(expr->position()); |
| 8208 return ast_context()->ReturnControl(result, expr->id()); | 8209 return ast_context()->ReturnInstruction(result, expr->id()); |
| 8209 } else { | 8210 } else { |
| 8210 HCompareNumericAndBranch* result = | 8211 HCompareNumericAndBranch* result = |
| 8211 New<HCompareNumericAndBranch>(left, right, op); | 8212 New<HCompareNumericAndBranch>(left, right, op); |
| 8212 result->set_observed_input_representation(left_rep, right_rep); | 8213 result->set_observed_input_representation(left_rep, right_rep); |
| 8213 result->set_position(expr->position()); | 8214 result->set_position(expr->position()); |
| 8214 return ast_context()->ReturnControl(result, expr->id()); | 8215 return ast_context()->ReturnControl(result, expr->id()); |
| 8215 } | 8216 } |
| 8216 } | 8217 } |
| 8217 } | 8218 } |
| 8218 | 8219 |
| (...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9773 if (ShouldProduceTraceOutput()) { | 9774 if (ShouldProduceTraceOutput()) { |
| 9774 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9775 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9775 } | 9776 } |
| 9776 | 9777 |
| 9777 #ifdef DEBUG | 9778 #ifdef DEBUG |
| 9778 graph_->Verify(false); // No full verify. | 9779 graph_->Verify(false); // No full verify. |
| 9779 #endif | 9780 #endif |
| 9780 } | 9781 } |
| 9781 | 9782 |
| 9782 } } // namespace v8::internal | 9783 } } // namespace v8::internal |
| OLD | NEW |