Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: src/hydrogen.cc

Issue 14838012: Revert r14610 because of test-262 failures. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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());
756 } else { 755 } else {
757 compare->SetSuccessorAt(0, first_true_block_); 756 compare->SetSuccessorAt(0, first_true_block_);
758 compare->SetSuccessorAt(1, first_false_block_); 757 compare->SetSuccessorAt(1, first_false_block_);
759 } 758 }
760 builder_->current_block()->Finish(compare); 759 builder_->current_block()->Finish(compare);
761 needs_compare_ = false; 760 needs_compare_ = false;
762 } 761 }
763 762
764 763
765 void HGraphBuilder::IfBuilder::Or() { 764 void HGraphBuilder::IfBuilder::Or() {
766 ASSERT(!did_and_); 765 ASSERT(!did_and_);
767 did_or_ = true; 766 did_or_ = true;
768 HEnvironment* env = first_false_block_->last_environment(); 767 HEnvironment* env = first_false_block_->last_environment();
769 if (split_edge_merge_block_ == NULL) { 768 if (split_edge_merge_block_ == NULL) {
770 split_edge_merge_block_ = 769 split_edge_merge_block_ =
771 builder_->CreateBasicBlock(env->Copy()); 770 builder_->CreateBasicBlock(env->Copy());
772 first_true_block_->GotoNoSimulate(split_edge_merge_block_); 771 first_true_block_->GotoNoSimulate(split_edge_merge_block_);
773 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
774 first_true_block_ = split_edge_merge_block_; 772 first_true_block_ = split_edge_merge_block_;
775 } 773 }
776 builder_->set_current_block(first_false_block_); 774 builder_->set_current_block(first_false_block_);
777 first_false_block_ = builder_->CreateBasicBlock(env->Copy()); 775 first_false_block_ = builder_->CreateBasicBlock(env->Copy());
778 } 776 }
779 777
780 778
781 void HGraphBuilder::IfBuilder::And() { 779 void HGraphBuilder::IfBuilder::And() {
782 ASSERT(!did_or_); 780 ASSERT(!did_or_);
783 did_and_ = true; 781 did_and_ = true;
784 HEnvironment* env = first_false_block_->last_environment(); 782 HEnvironment* env = first_false_block_->last_environment();
785 if (split_edge_merge_block_ == NULL) { 783 if (split_edge_merge_block_ == NULL) {
786 split_edge_merge_block_ = builder_->CreateBasicBlock(env->Copy()); 784 split_edge_merge_block_ = builder_->CreateBasicBlock(env->Copy());
787 first_false_block_->GotoNoSimulate(split_edge_merge_block_); 785 first_false_block_->GotoNoSimulate(split_edge_merge_block_);
788 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
789 first_false_block_ = split_edge_merge_block_; 786 first_false_block_ = split_edge_merge_block_;
790 } 787 }
791 builder_->set_current_block(first_true_block_); 788 builder_->set_current_block(first_true_block_);
792 first_true_block_ = builder_->CreateBasicBlock(env->Copy()); 789 first_true_block_ = builder_->CreateBasicBlock(env->Copy());
793 } 790 }
794 791
795 792
796 void HGraphBuilder::IfBuilder::CaptureContinuation( 793 void HGraphBuilder::IfBuilder::CaptureContinuation(
797 HIfContinuation* continuation) { 794 HIfContinuation* continuation) {
798 ASSERT(!finished_); 795 ASSERT(!finished_);
(...skipping 11 matching lines...) Expand all
810 807
811 808
812 void HGraphBuilder::IfBuilder::Then() { 809 void HGraphBuilder::IfBuilder::Then() {
813 ASSERT(!captured_); 810 ASSERT(!captured_);
814 ASSERT(!finished_); 811 ASSERT(!finished_);
815 did_then_ = true; 812 did_then_ = true;
816 if (needs_compare_) { 813 if (needs_compare_) {
817 // Handle if's without any expressions, they jump directly to the "else" 814 // Handle if's without any expressions, they jump directly to the "else"
818 // branch. 815 // branch.
819 builder_->current_block()->GotoNoSimulate(first_false_block_); 816 builder_->current_block()->GotoNoSimulate(first_false_block_);
820 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
821 first_true_block_ = NULL; 817 first_true_block_ = NULL;
822 } 818 }
823 builder_->set_current_block(first_true_block_); 819 builder_->set_current_block(first_true_block_);
824 } 820 }
825 821
826 822
827 void HGraphBuilder::IfBuilder::Else() { 823 void HGraphBuilder::IfBuilder::Else() {
828 ASSERT(did_then_); 824 ASSERT(did_then_);
829 ASSERT(!captured_); 825 ASSERT(!captured_);
830 ASSERT(!finished_); 826 ASSERT(!finished_);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 } else { 869 } else {
874 HEnvironment* merge_env = last_true_block_->last_environment()->Copy(); 870 HEnvironment* merge_env = last_true_block_->last_environment()->Copy();
875 merge_block_ = builder_->CreateBasicBlock(merge_env); 871 merge_block_ = builder_->CreateBasicBlock(merge_env);
876 ASSERT(!finished_); 872 ASSERT(!finished_);
877 if (!did_else_) Else(); 873 if (!did_else_) Else();
878 ASSERT(!last_true_block_->IsFinished()); 874 ASSERT(!last_true_block_->IsFinished());
879 HBasicBlock* last_false_block = builder_->current_block(); 875 HBasicBlock* last_false_block = builder_->current_block();
880 ASSERT(!last_false_block->IsFinished()); 876 ASSERT(!last_false_block->IsFinished());
881 last_true_block_->GotoNoSimulate(merge_block_); 877 last_true_block_->GotoNoSimulate(merge_block_);
882 last_false_block->GotoNoSimulate(merge_block_); 878 last_false_block->GotoNoSimulate(merge_block_);
883 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
884 builder_->set_current_block(merge_block_); 879 builder_->set_current_block(merge_block_);
885 } 880 }
886 } 881 }
887 finished_ = true; 882 finished_ = true;
888 } 883 }
889 884
890 885
891 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder, 886 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder,
892 HValue* context, 887 HValue* context,
893 LoopBuilder::Direction direction) 888 LoopBuilder::Direction direction)
(...skipping 12 matching lines...) Expand all
906 HValue* terminating, 901 HValue* terminating,
907 Token::Value token, 902 Token::Value token,
908 Representation input_representation) { 903 Representation input_representation) {
909 HEnvironment* env = builder_->environment(); 904 HEnvironment* env = builder_->environment();
910 phi_ = new(zone()) HPhi(env->values()->length(), zone()); 905 phi_ = new(zone()) HPhi(env->values()->length(), zone());
911 header_block_->AddPhi(phi_); 906 header_block_->AddPhi(phi_);
912 phi_->AddInput(initial); 907 phi_->AddInput(initial);
913 phi_->AssumeRepresentation(Representation::Integer32()); 908 phi_->AssumeRepresentation(Representation::Integer32());
914 env->Push(initial); 909 env->Push(initial);
915 builder_->current_block()->GotoNoSimulate(header_block_); 910 builder_->current_block()->GotoNoSimulate(header_block_);
916 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
917 911
918 HEnvironment* body_env = env->Copy(); 912 HEnvironment* body_env = env->Copy();
919 HEnvironment* exit_env = env->Copy(); 913 HEnvironment* exit_env = env->Copy();
920 body_block_ = builder_->CreateBasicBlock(body_env); 914 body_block_ = builder_->CreateBasicBlock(body_env);
921 exit_block_ = builder_->CreateBasicBlock(exit_env); 915 exit_block_ = builder_->CreateBasicBlock(exit_env);
922 // Remove the phi from the expression stack 916 // Remove the phi from the expression stack
923 body_env->Pop(); 917 body_env->Pop();
924 918
925 builder_->set_current_block(header_block_); 919 builder_->set_current_block(header_block_);
926 HCompareIDAndBranch* compare = 920 HCompareIDAndBranch* compare =
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 increment_ = HSub::New(zone(), context_, phi_, one); 955 increment_ = HSub::New(zone(), context_, phi_, one);
962 } 956 }
963 increment_->ClearFlag(HValue::kCanOverflow); 957 increment_->ClearFlag(HValue::kCanOverflow);
964 increment_->AssumeRepresentation(Representation::Integer32()); 958 increment_->AssumeRepresentation(Representation::Integer32());
965 builder_->AddInstruction(increment_); 959 builder_->AddInstruction(increment_);
966 } 960 }
967 961
968 // Push the new increment value on the expression stack to merge into the phi. 962 // Push the new increment value on the expression stack to merge into the phi.
969 builder_->environment()->Push(increment_); 963 builder_->environment()->Push(increment_);
970 builder_->current_block()->GotoNoSimulate(header_block_); 964 builder_->current_block()->GotoNoSimulate(header_block_);
971 ASSERT(builder_->SafeToAddPhiInNoSideEffectsScope());
972 header_block_->loop_information()->RegisterBackEdge(body_block_); 965 header_block_->loop_information()->RegisterBackEdge(body_block_);
973 966
974 builder_->set_current_block(exit_block_); 967 builder_->set_current_block(exit_block_);
975 // Pop the phi from the expression stack 968 // Pop the phi from the expression stack
976 builder_->environment()->Pop(); 969 builder_->environment()->Pop();
977 finished_ = true; 970 finished_ = true;
978 } 971 }
979 972
980 973
981 HGraph* HGraphBuilder::CreateGraph() { 974 HGraph* HGraphBuilder::CreateGraph() {
(...skipping 7246 matching lines...) Expand 10 before | Expand all | Expand 10 after
8228 Push(access); 8221 Push(access);
8229 } 8222 }
8230 8223
8231 *has_side_effects |= access->HasObservableSideEffects(); 8224 *has_side_effects |= access->HasObservableSideEffects();
8232 // The caller will use has_side_effects and add correct Simulate. 8225 // The caller will use has_side_effects and add correct Simulate.
8233 access->SetFlag(HValue::kHasNoObservableSideEffects); 8226 access->SetFlag(HValue::kHasNoObservableSideEffects);
8234 if (position != -1) { 8227 if (position != -1) {
8235 access->set_position(position); 8228 access->set_position(position);
8236 } 8229 }
8237 if_jsarray->GotoNoSimulate(join); 8230 if_jsarray->GotoNoSimulate(join);
8238 ASSERT(SafeToAddPhiInNoSideEffectsScope());
8239 8231
8240 set_current_block(if_fastobject); 8232 set_current_block(if_fastobject);
8241 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); 8233 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
8242 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY); 8234 checked_key = AddBoundsCheck(key, length, ALLOW_SMI_KEY);
8243 access = AddInstruction(BuildFastElementAccess( 8235 access = AddInstruction(BuildFastElementAccess(
8244 elements, checked_key, val, elements_kind_branch, 8236 elements, checked_key, val, elements_kind_branch,
8245 elements_kind, is_store, STANDARD_STORE)); 8237 elements_kind, is_store, STANDARD_STORE));
8246 } else if (elements_kind == DICTIONARY_ELEMENTS) { 8238 } else if (elements_kind == DICTIONARY_ELEMENTS) {
8247 if (is_store) { 8239 if (is_store) {
8248 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); 8240 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val));
8249 } else { 8241 } else {
8250 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); 8242 access = AddInstruction(BuildLoadKeyedGeneric(object, key));
8251 } 8243 }
8252 } else { // External array elements. 8244 } else { // External array elements.
8253 access = AddInstruction(BuildExternalArrayElementAccess( 8245 access = AddInstruction(BuildExternalArrayElementAccess(
8254 external_elements, checked_key, val, 8246 external_elements, checked_key, val,
8255 elements_kind_branch, elements_kind, is_store)); 8247 elements_kind_branch, elements_kind, is_store));
8256 } 8248 }
8257 *has_side_effects |= access->HasObservableSideEffects(); 8249 *has_side_effects |= access->HasObservableSideEffects();
8258 // The caller will use has_side_effects and add correct Simulate. 8250 // The caller will use has_side_effects and add correct Simulate.
8259 access->SetFlag(HValue::kHasNoObservableSideEffects); 8251 access->SetFlag(HValue::kHasNoObservableSideEffects);
8260 if (position != RelocInfo::kNoPosition) access->set_position(position); 8252 if (position != RelocInfo::kNoPosition) access->set_position(position);
8261 if (!is_store) { 8253 if (!is_store) {
8262 Push(access); 8254 Push(access);
8263 } 8255 }
8264 current_block()->GotoNoSimulate(join); 8256 current_block()->GotoNoSimulate(join);
8265 ASSERT(SafeToAddPhiInNoSideEffectsScope());
8266 set_current_block(if_false); 8257 set_current_block(if_false);
8267 } 8258 }
8268 } 8259 }
8269 8260
8270 // Deopt if none of the cases matched. 8261 // Deopt if none of the cases matched.
8271 current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); 8262 current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses);
8272 set_current_block(join); 8263 set_current_block(join);
8273 return is_store ? NULL : Pop(); 8264 return is_store ? NULL : Pop();
8274 } 8265 }
8275 8266
(...skipping 4151 matching lines...) Expand 10 before | Expand all | Expand 10 after
12427 } 12418 }
12428 } 12419 }
12429 12420
12430 #ifdef DEBUG 12421 #ifdef DEBUG
12431 if (graph_ != NULL) graph_->Verify(false); // No full verify. 12422 if (graph_ != NULL) graph_->Verify(false); // No full verify.
12432 if (allocator_ != NULL) allocator_->Verify(); 12423 if (allocator_ != NULL) allocator_->Verify();
12433 #endif 12424 #endif
12434 } 12425 }
12435 12426
12436 } } // namespace v8::internal 12427 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698