OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/pipeline.h" | 5 #include "src/compiler/pipeline.h" |
6 #include "src/compiler/scheduler.h" | 6 #include "src/compiler/scheduler.h" |
7 #include "src/compiler/structured-machine-assembler.h" | 7 #include "src/compiler/structured-machine-assembler.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 } | 175 } |
176 new_env->variables_.push_back(phi); | 176 new_env->variables_.push_back(phi); |
177 } | 177 } |
178 return new_env; | 178 return new_env; |
179 } | 179 } |
180 | 180 |
181 | 181 |
182 void StructuredMachineAssembler::MergeBackEdgesToLoopHeader( | 182 void StructuredMachineAssembler::MergeBackEdgesToLoopHeader( |
183 Environment* header, EnvironmentVector* environments) { | 183 Environment* header, EnvironmentVector* environments) { |
184 // Only merge as many variables are were declared before this loop. | 184 // Only merge as many variables are were declared before this loop. |
185 size_t n = header->variables_.size(); | 185 int n = static_cast<int>(header->variables_.size()); |
186 // TODO(dcarney): invert loop order and extend phis once. | 186 // TODO(dcarney): invert loop order and extend phis once. |
187 for (EnvironmentVector::iterator i = environments->begin(); | 187 for (EnvironmentVector::iterator i = environments->begin(); |
188 i != environments->end(); ++i) { | 188 i != environments->end(); ++i) { |
189 Environment* from = *i; | 189 Environment* from = *i; |
190 if (from->is_dead_) continue; | 190 if (from->is_dead_) continue; |
191 AddGoto(from, header); | 191 AddGoto(from, header); |
192 for (size_t i = 0; i < n; ++i) { | 192 for (int i = 0; i < n; ++i) { |
193 Node* phi = header->variables_[i]; | 193 Node* phi = header->variables_[i]; |
194 if (phi == NULL) continue; | 194 if (phi == NULL) continue; |
195 phi->set_op(common()->Phi(phi->InputCount() + 1)); | 195 phi->set_op(common()->Phi(phi->InputCount() + 1)); |
196 phi->AppendInput(zone(), VariableAt(from, i)); | 196 phi->AppendInput(zone(), VariableAt(from, i)); |
197 } | 197 } |
198 } | 198 } |
199 } | 199 } |
200 | 200 |
201 | 201 |
202 void StructuredMachineAssembler::Merge(EnvironmentVector* environments, | 202 void StructuredMachineAssembler::Merge(EnvironmentVector* environments, |
(...skipping 23 matching lines...) Expand all Loading... |
226 // Find first non equal variable. | 226 // Find first non equal variable. |
227 size_t i = 0; | 227 size_t i = 0; |
228 for (; i < n_envs; i++) { | 228 for (; i < n_envs; i++) { |
229 ASSERT(live_environments[i]->variables_.size() <= n_vars); | 229 ASSERT(live_environments[i]->variables_.size() <= n_vars); |
230 Node* val = NULL; | 230 Node* val = NULL; |
231 if (j < static_cast<size_t>(truncate_at)) { | 231 if (j < static_cast<size_t>(truncate_at)) { |
232 val = live_environments[i]->variables_.at(j); | 232 val = live_environments[i]->variables_.at(j); |
233 // TODO(dcarney): record start position at time of split. | 233 // TODO(dcarney): record start position at time of split. |
234 // all variables after this should not be NULL. | 234 // all variables after this should not be NULL. |
235 if (val != NULL) { | 235 if (val != NULL) { |
236 val = VariableAt(live_environments[i], j); | 236 val = VariableAt(live_environments[i], static_cast<int>(j)); |
237 } | 237 } |
238 } | 238 } |
239 if (val == resolved) continue; | 239 if (val == resolved) continue; |
240 if (i != 0) break; | 240 if (i != 0) break; |
241 resolved = val; | 241 resolved = val; |
242 } | 242 } |
243 // Have to generate a phi. | 243 // Have to generate a phi. |
244 if (i < n_envs) { | 244 if (i < n_envs) { |
245 // All values thus far uninitialized, variable used out of scope. | 245 // All values thus far uninitialized, variable used out of scope. |
246 CHECK(resolved != NULL); | 246 CHECK(resolved != NULL); |
247 // Init scratch buffer. | 247 // Init scratch buffer. |
248 if (scratch == NULL) { | 248 if (scratch == NULL) { |
249 scratch = static_cast<Node**>(alloca(n_envs * sizeof(resolved))); | 249 scratch = static_cast<Node**>(alloca(n_envs * sizeof(resolved))); |
250 } | 250 } |
251 for (size_t k = 0; k < i; k++) { | 251 for (size_t k = 0; k < i; k++) { |
252 scratch[k] = resolved; | 252 scratch[k] = resolved; |
253 } | 253 } |
254 for (; i < n_envs; i++) { | 254 for (; i < n_envs; i++) { |
255 scratch[i] = live_environments[i]->variables_[j]; | 255 scratch[i] = live_environments[i]->variables_[j]; |
256 } | 256 } |
257 resolved = graph()->NewNode(common()->Phi(n_envs), n_envs, scratch); | 257 resolved = graph()->NewNode(common()->Phi(static_cast<int>(n_envs)), |
| 258 static_cast<int>(n_envs), scratch); |
258 if (next->block_ != NULL) { | 259 if (next->block_ != NULL) { |
259 schedule()->AddNode(next->block_, resolved); | 260 schedule()->AddNode(next->block_, resolved); |
260 } | 261 } |
261 } | 262 } |
262 vars.push_back(resolved); | 263 vars.push_back(resolved); |
263 } | 264 } |
264 } | 265 } |
265 | 266 |
266 | 267 |
267 void StructuredMachineAssembler::AddGoto(Environment* from, Environment* to) { | 268 void StructuredMachineAssembler::AddGoto(Environment* from, Environment* to) { |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 | 638 |
638 | 639 |
639 void StructuredMachineAssembler::LoopBuilder::End() { | 640 void StructuredMachineAssembler::LoopBuilder::End() { |
640 ASSERT(!IsDone()); | 641 ASSERT(!IsDone()); |
641 if (smasm_->current_environment_ != NULL) { | 642 if (smasm_->current_environment_ != NULL) { |
642 Continue(); | 643 Continue(); |
643 } | 644 } |
644 // Do loop header merges. | 645 // Do loop header merges. |
645 smasm_->MergeBackEdgesToLoopHeader(header_environment_, | 646 smasm_->MergeBackEdgesToLoopHeader(header_environment_, |
646 &pending_header_merges_); | 647 &pending_header_merges_); |
647 int initial_size = header_environment_->variables_.size(); | 648 int initial_size = static_cast<int>(header_environment_->variables_.size()); |
648 // Do loop exit merges, truncating loop variables away. | 649 // Do loop exit merges, truncating loop variables away. |
649 smasm_->Merge(&pending_exit_merges_, initial_size); | 650 smasm_->Merge(&pending_exit_merges_, initial_size); |
650 for (EnvironmentVector::iterator i = pending_exit_merges_.begin(); | 651 for (EnvironmentVector::iterator i = pending_exit_merges_.begin(); |
651 i != pending_exit_merges_.end(); ++i) { | 652 i != pending_exit_merges_.end(); ++i) { |
652 smasm_->AddGoto(*i, smasm_->current_environment_); | 653 smasm_->AddGoto(*i, smasm_->current_environment_); |
653 } | 654 } |
654 pending_header_merges_.clear(); | 655 pending_header_merges_.clear(); |
655 pending_exit_merges_.clear(); | 656 pending_exit_merges_.clear(); |
656 header_environment_ = NULL; | 657 header_environment_ = NULL; |
657 ASSERT(IsDone()); | 658 ASSERT(IsDone()); |
658 } | 659 } |
659 | 660 |
660 } // namespace compiler | 661 } // namespace compiler |
661 } // namespace internal | 662 } // namespace internal |
662 } // namespace v8 | 663 } // namespace v8 |
OLD | NEW |