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 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 finished_(false) { | 891 finished_(false) { |
892 header_block_ = builder->CreateLoopHeaderBlock(); | 892 header_block_ = builder->CreateLoopHeaderBlock(); |
893 body_block_ = NULL; | 893 body_block_ = NULL; |
894 exit_block_ = NULL; | 894 exit_block_ = NULL; |
895 } | 895 } |
896 | 896 |
897 | 897 |
898 HValue* HGraphBuilder::LoopBuilder::BeginBody( | 898 HValue* HGraphBuilder::LoopBuilder::BeginBody( |
899 HValue* initial, | 899 HValue* initial, |
900 HValue* terminating, | 900 HValue* terminating, |
901 Token::Value token, | 901 Token::Value token) { |
902 Representation input_representation) { | |
903 HEnvironment* env = builder_->environment(); | 902 HEnvironment* env = builder_->environment(); |
904 phi_ = new(zone()) HPhi(env->values()->length(), zone()); | 903 phi_ = new(zone()) HPhi(env->values()->length(), zone()); |
905 header_block_->AddPhi(phi_); | 904 header_block_->AddPhi(phi_); |
906 phi_->AddInput(initial); | 905 phi_->AddInput(initial); |
907 phi_->AssumeRepresentation(Representation::Integer32()); | |
908 env->Push(initial); | 906 env->Push(initial); |
909 builder_->current_block()->GotoNoSimulate(header_block_); | 907 builder_->current_block()->GotoNoSimulate(header_block_); |
910 | 908 |
911 HEnvironment* body_env = env->Copy(); | 909 HEnvironment* body_env = env->Copy(); |
912 HEnvironment* exit_env = env->Copy(); | 910 HEnvironment* exit_env = env->Copy(); |
913 body_block_ = builder_->CreateBasicBlock(body_env); | 911 body_block_ = builder_->CreateBasicBlock(body_env); |
914 exit_block_ = builder_->CreateBasicBlock(exit_env); | 912 exit_block_ = builder_->CreateBasicBlock(exit_env); |
915 // Remove the phi from the expression stack | 913 // Remove the phi from the expression stack |
916 body_env->Pop(); | 914 body_env->Pop(); |
917 | 915 |
918 builder_->set_current_block(header_block_); | 916 builder_->set_current_block(header_block_); |
919 HCompareIDAndBranch* compare = | 917 HCompareIDAndBranch* compare = |
920 new(zone()) HCompareIDAndBranch(phi_, terminating, token); | 918 new(zone()) HCompareIDAndBranch(phi_, terminating, token); |
921 compare->set_observed_input_representation(input_representation, | |
922 input_representation); | |
923 compare->AssumeRepresentation(input_representation); | |
924 compare->SetSuccessorAt(0, body_block_); | 919 compare->SetSuccessorAt(0, body_block_); |
925 compare->SetSuccessorAt(1, exit_block_); | 920 compare->SetSuccessorAt(1, exit_block_); |
926 builder_->current_block()->Finish(compare); | 921 builder_->current_block()->Finish(compare); |
927 | 922 |
928 builder_->set_current_block(body_block_); | 923 builder_->set_current_block(body_block_); |
929 if (direction_ == kPreIncrement || direction_ == kPreDecrement) { | 924 if (direction_ == kPreIncrement || direction_ == kPreDecrement) { |
930 HValue* one = builder_->graph()->GetConstant1(); | 925 HValue* one = builder_->graph()->GetConstant1(); |
931 if (direction_ == kPreIncrement) { | 926 if (direction_ == kPreIncrement) { |
932 increment_ = HAdd::New(zone(), context_, phi_, one); | 927 increment_ = HAdd::New(zone(), context_, phi_, one); |
933 } else { | 928 } else { |
934 increment_ = HSub::New(zone(), context_, phi_, one); | 929 increment_ = HSub::New(zone(), context_, phi_, one); |
935 } | 930 } |
936 increment_->ClearFlag(HValue::kCanOverflow); | 931 increment_->ClearFlag(HValue::kCanOverflow); |
937 increment_->AssumeRepresentation(Representation::Integer32()); | |
938 builder_->AddInstruction(increment_); | 932 builder_->AddInstruction(increment_); |
939 return increment_; | 933 return increment_; |
940 } else { | 934 } else { |
941 return phi_; | 935 return phi_; |
942 } | 936 } |
943 } | 937 } |
944 | 938 |
945 | 939 |
946 void HGraphBuilder::LoopBuilder::EndBody() { | 940 void HGraphBuilder::LoopBuilder::EndBody() { |
947 ASSERT(!finished_); | 941 ASSERT(!finished_); |
948 | 942 |
949 if (direction_ == kPostIncrement || direction_ == kPostDecrement) { | 943 if (direction_ == kPostIncrement || direction_ == kPostDecrement) { |
950 HValue* one = builder_->graph()->GetConstant1(); | 944 HValue* one = builder_->graph()->GetConstant1(); |
951 if (direction_ == kPostIncrement) { | 945 if (direction_ == kPostIncrement) { |
952 increment_ = HAdd::New(zone(), context_, phi_, one); | 946 increment_ = HAdd::New(zone(), context_, phi_, one); |
953 } else { | 947 } else { |
954 increment_ = HSub::New(zone(), context_, phi_, one); | 948 increment_ = HSub::New(zone(), context_, phi_, one); |
955 } | 949 } |
956 increment_->ClearFlag(HValue::kCanOverflow); | 950 increment_->ClearFlag(HValue::kCanOverflow); |
957 increment_->AssumeRepresentation(Representation::Integer32()); | |
958 builder_->AddInstruction(increment_); | 951 builder_->AddInstruction(increment_); |
959 } | 952 } |
960 | 953 |
961 // Push the new increment value on the expression stack to merge into the phi. | 954 // Push the new increment value on the expression stack to merge into the phi. |
962 builder_->environment()->Push(increment_); | 955 builder_->environment()->Push(increment_); |
963 builder_->current_block()->GotoNoSimulate(header_block_); | 956 builder_->current_block()->GotoNoSimulate(header_block_); |
964 header_block_->loop_information()->RegisterBackEdge(body_block_); | 957 header_block_->loop_information()->RegisterBackEdge(body_block_); |
965 | 958 |
966 builder_->set_current_block(exit_block_); | 959 builder_->set_current_block(exit_block_); |
967 // Pop the phi from the expression stack | 960 // Pop the phi from the expression stack |
(...skipping 10642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11610 } | 11603 } |
11611 } | 11604 } |
11612 | 11605 |
11613 #ifdef DEBUG | 11606 #ifdef DEBUG |
11614 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 11607 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
11615 if (allocator_ != NULL) allocator_->Verify(); | 11608 if (allocator_ != NULL) allocator_->Verify(); |
11616 #endif | 11609 #endif |
11617 } | 11610 } |
11618 | 11611 |
11619 } } // namespace v8::internal | 11612 } } // namespace v8::internal |
OLD | NEW |