| 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 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 HBasicBlock* split_edge = | 745 HBasicBlock* split_edge = |
| 746 builder_->CreateBasicBlock(env->Copy()); | 746 builder_->CreateBasicBlock(env->Copy()); |
| 747 if (did_or_) { | 747 if (did_or_) { |
| 748 compare->SetSuccessorAt(0, split_edge); | 748 compare->SetSuccessorAt(0, split_edge); |
| 749 compare->SetSuccessorAt(1, first_false_block_); | 749 compare->SetSuccessorAt(1, first_false_block_); |
| 750 } else { | 750 } else { |
| 751 compare->SetSuccessorAt(0, first_true_block_); | 751 compare->SetSuccessorAt(0, first_true_block_); |
| 752 compare->SetSuccessorAt(1, split_edge); | 752 compare->SetSuccessorAt(1, split_edge); |
| 753 } | 753 } |
| 754 split_edge->GotoNoSimulate(split_edge_merge_block_); | 754 split_edge->GotoNoSimulate(split_edge_merge_block_); |
| 755 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 755 } else { | 756 } else { |
| 756 compare->SetSuccessorAt(0, first_true_block_); | 757 compare->SetSuccessorAt(0, first_true_block_); |
| 757 compare->SetSuccessorAt(1, first_false_block_); | 758 compare->SetSuccessorAt(1, first_false_block_); |
| 758 } | 759 } |
| 759 builder_->current_block()->Finish(compare); | 760 builder_->current_block()->Finish(compare); |
| 760 needs_compare_ = false; | 761 needs_compare_ = false; |
| 761 } | 762 } |
| 762 | 763 |
| 763 | 764 |
| 764 void HGraphBuilder::IfBuilder::Or() { | 765 void HGraphBuilder::IfBuilder::Or() { |
| 765 ASSERT(!did_and_); | 766 ASSERT(!did_and_); |
| 766 did_or_ = true; | 767 did_or_ = true; |
| 767 HEnvironment* env = first_false_block_->last_environment(); | 768 HEnvironment* env = first_false_block_->last_environment(); |
| 768 if (split_edge_merge_block_ == NULL) { | 769 if (split_edge_merge_block_ == NULL) { |
| 769 split_edge_merge_block_ = | 770 split_edge_merge_block_ = |
| 770 builder_->CreateBasicBlock(env->Copy()); | 771 builder_->CreateBasicBlock(env->Copy()); |
| 771 first_true_block_->GotoNoSimulate(split_edge_merge_block_); | 772 first_true_block_->GotoNoSimulate(split_edge_merge_block_); |
| 773 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 772 first_true_block_ = split_edge_merge_block_; | 774 first_true_block_ = split_edge_merge_block_; |
| 773 } | 775 } |
| 774 builder_->set_current_block(first_false_block_); | 776 builder_->set_current_block(first_false_block_); |
| 775 first_false_block_ = builder_->CreateBasicBlock(env->Copy()); | 777 first_false_block_ = builder_->CreateBasicBlock(env->Copy()); |
| 776 } | 778 } |
| 777 | 779 |
| 778 | 780 |
| 779 void HGraphBuilder::IfBuilder::And() { | 781 void HGraphBuilder::IfBuilder::And() { |
| 780 ASSERT(!did_or_); | 782 ASSERT(!did_or_); |
| 781 did_and_ = true; | 783 did_and_ = true; |
| 782 HEnvironment* env = first_false_block_->last_environment(); | 784 HEnvironment* env = first_false_block_->last_environment(); |
| 783 if (split_edge_merge_block_ == NULL) { | 785 if (split_edge_merge_block_ == NULL) { |
| 784 split_edge_merge_block_ = builder_->CreateBasicBlock(env->Copy()); | 786 split_edge_merge_block_ = builder_->CreateBasicBlock(env->Copy()); |
| 785 first_false_block_->GotoNoSimulate(split_edge_merge_block_); | 787 first_false_block_->GotoNoSimulate(split_edge_merge_block_); |
| 788 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 786 first_false_block_ = split_edge_merge_block_; | 789 first_false_block_ = split_edge_merge_block_; |
| 787 } | 790 } |
| 788 builder_->set_current_block(first_true_block_); | 791 builder_->set_current_block(first_true_block_); |
| 789 first_true_block_ = builder_->CreateBasicBlock(env->Copy()); | 792 first_true_block_ = builder_->CreateBasicBlock(env->Copy()); |
| 790 } | 793 } |
| 791 | 794 |
| 792 | 795 |
| 793 void HGraphBuilder::IfBuilder::CaptureContinuation( | 796 void HGraphBuilder::IfBuilder::CaptureContinuation( |
| 794 HIfContinuation* continuation) { | 797 HIfContinuation* continuation) { |
| 795 ASSERT(!finished_); | 798 ASSERT(!finished_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 807 | 810 |
| 808 | 811 |
| 809 void HGraphBuilder::IfBuilder::Then() { | 812 void HGraphBuilder::IfBuilder::Then() { |
| 810 ASSERT(!captured_); | 813 ASSERT(!captured_); |
| 811 ASSERT(!finished_); | 814 ASSERT(!finished_); |
| 812 did_then_ = true; | 815 did_then_ = true; |
| 813 if (needs_compare_) { | 816 if (needs_compare_) { |
| 814 // Handle if's without any expressions, they jump directly to the "else" | 817 // Handle if's without any expressions, they jump directly to the "else" |
| 815 // branch. | 818 // branch. |
| 816 builder_->current_block()->GotoNoSimulate(first_false_block_); | 819 builder_->current_block()->GotoNoSimulate(first_false_block_); |
| 820 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 817 first_true_block_ = NULL; | 821 first_true_block_ = NULL; |
| 818 } | 822 } |
| 819 builder_->set_current_block(first_true_block_); | 823 builder_->set_current_block(first_true_block_); |
| 820 } | 824 } |
| 821 | 825 |
| 822 | 826 |
| 823 void HGraphBuilder::IfBuilder::Else() { | 827 void HGraphBuilder::IfBuilder::Else() { |
| 824 ASSERT(did_then_); | 828 ASSERT(did_then_); |
| 825 ASSERT(!captured_); | 829 ASSERT(!captured_); |
| 826 ASSERT(!finished_); | 830 ASSERT(!finished_); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 } else { | 873 } else { |
| 870 HEnvironment* merge_env = last_true_block_->last_environment()->Copy(); | 874 HEnvironment* merge_env = last_true_block_->last_environment()->Copy(); |
| 871 merge_block_ = builder_->CreateBasicBlock(merge_env); | 875 merge_block_ = builder_->CreateBasicBlock(merge_env); |
| 872 ASSERT(!finished_); | 876 ASSERT(!finished_); |
| 873 if (!did_else_) Else(); | 877 if (!did_else_) Else(); |
| 874 ASSERT(!last_true_block_->IsFinished()); | 878 ASSERT(!last_true_block_->IsFinished()); |
| 875 HBasicBlock* last_false_block = builder_->current_block(); | 879 HBasicBlock* last_false_block = builder_->current_block(); |
| 876 ASSERT(!last_false_block->IsFinished()); | 880 ASSERT(!last_false_block->IsFinished()); |
| 877 last_true_block_->GotoNoSimulate(merge_block_); | 881 last_true_block_->GotoNoSimulate(merge_block_); |
| 878 last_false_block->GotoNoSimulate(merge_block_); | 882 last_false_block->GotoNoSimulate(merge_block_); |
| 883 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 879 builder_->set_current_block(merge_block_); | 884 builder_->set_current_block(merge_block_); |
| 880 } | 885 } |
| 881 } | 886 } |
| 882 finished_ = true; | 887 finished_ = true; |
| 883 } | 888 } |
| 884 | 889 |
| 885 | 890 |
| 886 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder, | 891 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder, |
| 887 HValue* context, | 892 HValue* context, |
| 888 LoopBuilder::Direction direction) | 893 LoopBuilder::Direction direction) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 901 HValue* terminating, | 906 HValue* terminating, |
| 902 Token::Value token, | 907 Token::Value token, |
| 903 Representation input_representation) { | 908 Representation input_representation) { |
| 904 HEnvironment* env = builder_->environment(); | 909 HEnvironment* env = builder_->environment(); |
| 905 phi_ = new(zone()) HPhi(env->values()->length(), zone()); | 910 phi_ = new(zone()) HPhi(env->values()->length(), zone()); |
| 906 header_block_->AddPhi(phi_); | 911 header_block_->AddPhi(phi_); |
| 907 phi_->AddInput(initial); | 912 phi_->AddInput(initial); |
| 908 phi_->ChangeRepresentation(Representation::Integer32()); | 913 phi_->ChangeRepresentation(Representation::Integer32()); |
| 909 env->Push(initial); | 914 env->Push(initial); |
| 910 builder_->current_block()->GotoNoSimulate(header_block_); | 915 builder_->current_block()->GotoNoSimulate(header_block_); |
| 916 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 911 | 917 |
| 912 HEnvironment* body_env = env->Copy(); | 918 HEnvironment* body_env = env->Copy(); |
| 913 HEnvironment* exit_env = env->Copy(); | 919 HEnvironment* exit_env = env->Copy(); |
| 914 body_block_ = builder_->CreateBasicBlock(body_env); | 920 body_block_ = builder_->CreateBasicBlock(body_env); |
| 915 exit_block_ = builder_->CreateBasicBlock(exit_env); | 921 exit_block_ = builder_->CreateBasicBlock(exit_env); |
| 916 // Remove the phi from the expression stack | 922 // Remove the phi from the expression stack |
| 917 body_env->Pop(); | 923 body_env->Pop(); |
| 918 | 924 |
| 919 builder_->set_current_block(header_block_); | 925 builder_->set_current_block(header_block_); |
| 920 HCompareIDAndBranch* compare = | 926 HCompareIDAndBranch* compare = |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 increment_ = HSub::New(zone(), context_, phi_, one); | 961 increment_ = HSub::New(zone(), context_, phi_, one); |
| 956 } | 962 } |
| 957 increment_->ClearFlag(HValue::kCanOverflow); | 963 increment_->ClearFlag(HValue::kCanOverflow); |
| 958 increment_->ChangeRepresentation(Representation::Integer32()); | 964 increment_->ChangeRepresentation(Representation::Integer32()); |
| 959 builder_->AddInstruction(increment_); | 965 builder_->AddInstruction(increment_); |
| 960 } | 966 } |
| 961 | 967 |
| 962 // Push the new increment value on the expression stack to merge into the phi. | 968 // Push the new increment value on the expression stack to merge into the phi. |
| 963 builder_->environment()->Push(increment_); | 969 builder_->environment()->Push(increment_); |
| 964 builder_->current_block()->GotoNoSimulate(header_block_); | 970 builder_->current_block()->GotoNoSimulate(header_block_); |
| 971 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope()); |
| 965 header_block_->loop_information()->RegisterBackEdge(body_block_); | 972 header_block_->loop_information()->RegisterBackEdge(body_block_); |
| 966 | 973 |
| 967 builder_->set_current_block(exit_block_); | 974 builder_->set_current_block(exit_block_); |
| 968 // Pop the phi from the expression stack | 975 // Pop the phi from the expression stack |
| 969 builder_->environment()->Pop(); | 976 builder_->environment()->Pop(); |
| 970 finished_ = true; | 977 finished_ = true; |
| 971 } | 978 } |
| 972 | 979 |
| 973 | 980 |
| 974 HGraph* HGraphBuilder::CreateGraph() { | 981 HGraph* HGraphBuilder::CreateGraph() { |
| (...skipping 7194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8169 Push(access); | 8176 Push(access); |
| 8170 } | 8177 } |
| 8171 | 8178 |
| 8172 *has_side_effects |= access->HasObservableSideEffects(); | 8179 *has_side_effects |= access->HasObservableSideEffects(); |
| 8173 // The caller will use has_side_effects and add correct Simulate. | 8180 // The caller will use has_side_effects and add correct Simulate. |
| 8174 access->SetFlag(HValue::kHasNoObservableSideEffects); | 8181 access->SetFlag(HValue::kHasNoObservableSideEffects); |
| 8175 if (position != -1) { | 8182 if (position != -1) { |
| 8176 access->set_position(position); | 8183 access->set_position(position); |
| 8177 } | 8184 } |
| 8178 if_jsarray->GotoNoSimulate(join); | 8185 if_jsarray->GotoNoSimulate(join); |
| 8186 ASSERT(SafeToAddPhiInNoSideEffectsScope()); |
| 8179 | 8187 |
| 8180 set_current_block(if_fastobject); | 8188 set_current_block(if_fastobject); |
| 8181 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); | 8189 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
| 8182 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); | 8190 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); |
| 8183 access = AddInstruction(BuildFastElementAccess( | 8191 access = AddInstruction(BuildFastElementAccess( |
| 8184 elements, checked_key, val, elements_kind_branch, | 8192 elements, checked_key, val, elements_kind_branch, |
| 8185 elements_kind, is_store, STANDARD_STORE)); | 8193 elements_kind, is_store, STANDARD_STORE)); |
| 8186 } else if (elements_kind == DICTIONARY_ELEMENTS) { | 8194 } else if (elements_kind == DICTIONARY_ELEMENTS) { |
| 8187 if (is_store) { | 8195 if (is_store) { |
| 8188 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); | 8196 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); |
| 8189 } else { | 8197 } else { |
| 8190 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); | 8198 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); |
| 8191 } | 8199 } |
| 8192 } else { // External array elements. | 8200 } else { // External array elements. |
| 8193 access = AddInstruction(BuildExternalArrayElementAccess( | 8201 access = AddInstruction(BuildExternalArrayElementAccess( |
| 8194 external_elements, checked_key, val, | 8202 external_elements, checked_key, val, |
| 8195 elements_kind_branch, elements_kind, is_store)); | 8203 elements_kind_branch, elements_kind, is_store)); |
| 8196 } | 8204 } |
| 8197 *has_side_effects |= access->HasObservableSideEffects(); | 8205 *has_side_effects |= access->HasObservableSideEffects(); |
| 8198 // The caller will use has_side_effects and add correct Simulate. | 8206 // The caller will use has_side_effects and add correct Simulate. |
| 8199 access->SetFlag(HValue::kHasNoObservableSideEffects); | 8207 access->SetFlag(HValue::kHasNoObservableSideEffects); |
| 8200 if (position != RelocInfo::kNoPosition) access->set_position(position); | 8208 if (position != RelocInfo::kNoPosition) access->set_position(position); |
| 8201 if (!is_store) { | 8209 if (!is_store) { |
| 8202 Push(access); | 8210 Push(access); |
| 8203 } | 8211 } |
| 8204 current_block()->GotoNoSimulate(join); | 8212 current_block()->GotoNoSimulate(join); |
| 8213 ASSERT(SafeToAddPhiInNoSideEffectsScope()); |
| 8205 set_current_block(if_false); | 8214 set_current_block(if_false); |
| 8206 } | 8215 } |
| 8207 } | 8216 } |
| 8208 | 8217 |
| 8209 // Deopt if none of the cases matched. | 8218 // Deopt if none of the cases matched. |
| 8210 current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); | 8219 current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); |
| 8211 set_current_block(join); | 8220 set_current_block(join); |
| 8212 return is_store ? NULL : Pop(); | 8221 return is_store ? NULL : Pop(); |
| 8213 } | 8222 } |
| 8214 | 8223 |
| (...skipping 4151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12366 } | 12375 } |
| 12367 } | 12376 } |
| 12368 | 12377 |
| 12369 #ifdef DEBUG | 12378 #ifdef DEBUG |
| 12370 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 12379 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 12371 if (allocator_ != NULL) allocator_->Verify(); | 12380 if (allocator_ != NULL) allocator_->Verify(); |
| 12372 #endif | 12381 #endif |
| 12373 } | 12382 } |
| 12374 | 12383 |
| 12375 } } // namespace v8::internal | 12384 } } // namespace v8::internal |
| OLD | NEW |