OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 } | 550 } |
551 | 551 |
552 | 552 |
553 void HBasicBlock::FinishExit(HControlInstruction* instruction) { | 553 void HBasicBlock::FinishExit(HControlInstruction* instruction) { |
554 Finish(instruction); | 554 Finish(instruction); |
555 ClearEnvironment(); | 555 ClearEnvironment(); |
556 } | 556 } |
557 | 557 |
558 | 558 |
559 HGraph::HGraph(CompilationInfo* info) | 559 HGraph::HGraph(CompilationInfo* info) |
560 : HSubgraph(this), | 560 : next_block_id_(0), |
561 next_block_id_(0), | 561 entry_block_(NULL), |
562 blocks_(8), | 562 blocks_(8), |
563 values_(16), | 563 values_(16), |
564 phi_list_(NULL) { | 564 phi_list_(NULL) { |
565 start_environment_ = new HEnvironment(NULL, info->scope(), info->closure()); | 565 start_environment_ = new HEnvironment(NULL, info->scope(), info->closure()); |
566 start_environment_->set_ast_id(info->function()->id()); | 566 start_environment_->set_ast_id(info->function()->id()); |
| 567 entry_block_ = CreateBasicBlock(); |
| 568 entry_block_->SetInitialEnvironment(start_environment_); |
567 } | 569 } |
568 | 570 |
569 | 571 |
570 Handle<Code> HGraph::Compile(CompilationInfo* info) { | 572 Handle<Code> HGraph::Compile(CompilationInfo* info) { |
571 int values = GetMaximumValueID(); | 573 int values = GetMaximumValueID(); |
572 if (values > LAllocator::max_initial_value_ids()) { | 574 if (values > LAllocator::max_initial_value_ids()) { |
573 if (FLAG_trace_bailout) PrintF("Function is too big\n"); | 575 if (FLAG_trace_bailout) PrintF("Function is too big\n"); |
574 return Handle<Code>::null(); | 576 return Handle<Code>::null(); |
575 } | 577 } |
576 | 578 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 if (!phi->is_live()) { | 780 if (!phi->is_live()) { |
779 HBasicBlock* block = phi->block(); | 781 HBasicBlock* block = phi->block(); |
780 block->RemovePhi(phi); | 782 block->RemovePhi(phi); |
781 block->RecordDeletedPhi(phi->merged_index()); | 783 block->RecordDeletedPhi(phi->merged_index()); |
782 } | 784 } |
783 } | 785 } |
784 } | 786 } |
785 | 787 |
786 | 788 |
787 bool HGraph::CollectPhis() { | 789 bool HGraph::CollectPhis() { |
788 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); | 790 int block_count = blocks_.length(); |
789 phi_list_ = new ZoneList<HPhi*>(blocks->length()); | 791 phi_list_ = new ZoneList<HPhi*>(block_count); |
790 for (int i = 0; i < blocks->length(); ++i) { | 792 for (int i = 0; i < block_count; ++i) { |
791 for (int j = 0; j < blocks->at(i)->phis()->length(); j++) { | 793 for (int j = 0; j < blocks_[i]->phis()->length(); ++j) { |
792 HPhi* phi = blocks->at(i)->phis()->at(j); | 794 HPhi* phi = blocks_[i]->phis()->at(j); |
793 phi_list_->Add(phi); | 795 phi_list_->Add(phi); |
794 // We don't support phi uses of arguments for now. | 796 // We don't support phi uses of arguments for now. |
795 if (phi->CheckFlag(HValue::kIsArguments)) return false; | 797 if (phi->CheckFlag(HValue::kIsArguments)) return false; |
796 } | 798 } |
797 } | 799 } |
798 return true; | 800 return true; |
799 } | 801 } |
800 | 802 |
801 | 803 |
802 void HGraph::InferTypes(ZoneList<HValue*>* worklist) { | 804 void HGraph::InferTypes(ZoneList<HValue*>* worklist) { |
(...skipping 1270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2073 } while (false) | 2075 } while (false) |
2074 | 2076 |
2075 | 2077 |
2076 #define VISIT_FOR_CONTROL(expr, true_block, false_block) \ | 2078 #define VISIT_FOR_CONTROL(expr, true_block, false_block) \ |
2077 do { \ | 2079 do { \ |
2078 VisitForControl(expr, true_block, false_block); \ | 2080 VisitForControl(expr, true_block, false_block); \ |
2079 if (HasStackOverflow()) return; \ | 2081 if (HasStackOverflow()) return; \ |
2080 } while (false) | 2082 } while (false) |
2081 | 2083 |
2082 | 2084 |
2083 // 'thing' could be an expression, statement, or list of statements. | |
2084 #define ADD_TO_SUBGRAPH(graph, thing) \ | |
2085 do { \ | |
2086 AddToSubgraph(graph, thing); \ | |
2087 if (HasStackOverflow()) return; \ | |
2088 } while (false) | |
2089 | |
2090 | |
2091 class HGraphBuilder::SubgraphScope BASE_EMBEDDED { | |
2092 public: | |
2093 SubgraphScope(HGraphBuilder* builder, HSubgraph* new_subgraph) | |
2094 : builder_(builder) { | |
2095 old_subgraph_ = builder_->current_subgraph_; | |
2096 subgraph_ = new_subgraph; | |
2097 builder_->current_subgraph_ = subgraph_; | |
2098 } | |
2099 | |
2100 ~SubgraphScope() { | |
2101 builder_->current_subgraph_ = old_subgraph_; | |
2102 } | |
2103 | |
2104 HSubgraph* subgraph() const { return subgraph_; } | |
2105 | |
2106 private: | |
2107 HGraphBuilder* builder_; | |
2108 HSubgraph* old_subgraph_; | |
2109 HSubgraph* subgraph_; | |
2110 }; | |
2111 | |
2112 | |
2113 void HGraphBuilder::Bailout(const char* reason) { | 2085 void HGraphBuilder::Bailout(const char* reason) { |
2114 if (FLAG_trace_bailout) { | 2086 if (FLAG_trace_bailout) { |
2115 SmartPointer<char> name(info()->shared_info()->DebugName()->ToCString()); | 2087 SmartPointer<char> name(info()->shared_info()->DebugName()->ToCString()); |
2116 PrintF("Bailout in HGraphBuilder: @\"%s\": %s\n", *name, reason); | 2088 PrintF("Bailout in HGraphBuilder: @\"%s\": %s\n", *name, reason); |
2117 } | 2089 } |
2118 SetStackOverflow(); | 2090 SetStackOverflow(); |
2119 } | 2091 } |
2120 | 2092 |
2121 | 2093 |
2122 void HGraphBuilder::VisitForEffect(Expression* expr) { | 2094 void HGraphBuilder::VisitForEffect(Expression* expr) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2154 | 2126 |
2155 | 2127 |
2156 void HGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs) { | 2128 void HGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs) { |
2157 for (int i = 0; i < exprs->length(); ++i) { | 2129 for (int i = 0; i < exprs->length(); ++i) { |
2158 VISIT_FOR_VALUE(exprs->at(i)); | 2130 VISIT_FOR_VALUE(exprs->at(i)); |
2159 } | 2131 } |
2160 } | 2132 } |
2161 | 2133 |
2162 | 2134 |
2163 HGraph* HGraphBuilder::CreateGraph() { | 2135 HGraph* HGraphBuilder::CreateGraph() { |
2164 ASSERT(subgraph() == NULL); | |
2165 graph_ = new HGraph(info()); | 2136 graph_ = new HGraph(info()); |
2166 | |
2167 { | 2137 { |
2168 HPhase phase("Block building"); | 2138 HPhase phase("Block building"); |
2169 graph()->Initialize(CreateBasicBlock(graph()->start_environment())); | 2139 current_block_ = graph()->entry_block(); |
2170 current_subgraph_ = graph(); | |
2171 | 2140 |
2172 Scope* scope = info()->scope(); | 2141 Scope* scope = info()->scope(); |
2173 if (scope->HasIllegalRedeclaration()) { | 2142 if (scope->HasIllegalRedeclaration()) { |
2174 Bailout("function with illegal redeclaration"); | 2143 Bailout("function with illegal redeclaration"); |
2175 return NULL; | 2144 return NULL; |
2176 } | 2145 } |
2177 SetupScope(scope); | 2146 SetupScope(scope); |
2178 VisitDeclarations(scope->declarations()); | 2147 VisitDeclarations(scope->declarations()); |
2179 AddInstruction(new HStackCheck()); | 2148 AddInstruction(new HStackCheck()); |
2180 | 2149 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2238 if (FLAG_use_gvn) { | 2207 if (FLAG_use_gvn) { |
2239 HPhase phase("Global value numbering", graph()); | 2208 HPhase phase("Global value numbering", graph()); |
2240 HGlobalValueNumberer gvn(graph(), info()); | 2209 HGlobalValueNumberer gvn(graph(), info()); |
2241 gvn.Analyze(); | 2210 gvn.Analyze(); |
2242 } | 2211 } |
2243 | 2212 |
2244 return graph(); | 2213 return graph(); |
2245 } | 2214 } |
2246 | 2215 |
2247 | 2216 |
2248 void HGraphBuilder::AddToSubgraph(HSubgraph* graph, Statement* stmt) { | |
2249 SubgraphScope scope(this, graph); | |
2250 Visit(stmt); | |
2251 } | |
2252 | |
2253 | |
2254 void HGraphBuilder::AddToSubgraph(HSubgraph* graph, Expression* expr) { | |
2255 SubgraphScope scope(this, graph); | |
2256 VisitForValue(expr); | |
2257 } | |
2258 | |
2259 | |
2260 void HGraphBuilder::AddToSubgraph(HSubgraph* graph, | |
2261 ZoneList<Statement*>* stmts) { | |
2262 SubgraphScope scope(this, graph); | |
2263 VisitStatements(stmts); | |
2264 } | |
2265 | |
2266 | |
2267 HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { | 2217 HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
2268 ASSERT(current_block() != NULL); | 2218 ASSERT(current_block() != NULL); |
2269 current_block()->AddInstruction(instr); | 2219 current_block()->AddInstruction(instr); |
2270 return instr; | 2220 return instr; |
2271 } | 2221 } |
2272 | 2222 |
2273 | 2223 |
2274 void HGraphBuilder::AddSimulate(int id) { | 2224 void HGraphBuilder::AddSimulate(int id) { |
2275 ASSERT(current_block() != NULL); | 2225 ASSERT(current_block() != NULL); |
2276 current_block()->AddSimulate(id); | 2226 current_block()->AddSimulate(id); |
(...skipping 3663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5940 } | 5890 } |
5941 } | 5891 } |
5942 | 5892 |
5943 #ifdef DEBUG | 5893 #ifdef DEBUG |
5944 if (graph_ != NULL) graph_->Verify(); | 5894 if (graph_ != NULL) graph_->Verify(); |
5945 if (allocator_ != NULL) allocator_->Verify(); | 5895 if (allocator_ != NULL) allocator_->Verify(); |
5946 #endif | 5896 #endif |
5947 } | 5897 } |
5948 | 5898 |
5949 } } // namespace v8::internal | 5899 } } // namespace v8::internal |
OLD | NEW |