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

Side by Side Diff: src/compiler/register-allocator-verifier.cc

Issue 860363002: [turbofan] Fix register allocator verifier to allow 1-input phis. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 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
« no previous file with comments | « no previous file | 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 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/instruction.h" 5 #include "src/compiler/instruction.h"
6 #include "src/compiler/register-allocator-verifier.h" 6 #include "src/compiler/register-allocator-verifier.h"
7 7
8 namespace v8 { 8 namespace v8 {
9 namespace internal { 9 namespace internal {
10 namespace compiler { 10 namespace compiler {
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 LocationMap::allocator_type(zone)), 235 LocationMap::allocator_type(zone)),
236 predecessor_intersection_(LocationMap::key_compare(), 236 predecessor_intersection_(LocationMap::key_compare(),
237 LocationMap::allocator_type(zone)) {} 237 LocationMap::allocator_type(zone)) {}
238 238
239 LocationMap* locations() { return &locations_; } 239 LocationMap* locations() { return &locations_; }
240 240
241 void RunPhis(const InstructionSequence* sequence, 241 void RunPhis(const InstructionSequence* sequence,
242 const InstructionBlock* block, size_t phi_index) { 242 const InstructionBlock* block, size_t phi_index) {
243 // This operation is only valid in edge split form. 243 // This operation is only valid in edge split form.
244 size_t predecessor_index = block->predecessors()[phi_index].ToSize(); 244 size_t predecessor_index = block->predecessors()[phi_index].ToSize();
245 CHECK(sequence->instruction_blocks()[predecessor_index]->SuccessorCount() == 245 for (const auto* phi : block->phis()) {
246 CHECK(
247 sequence->instruction_blocks()[predecessor_index]->SuccessorCount() ==
246 1); 248 1);
247 for (const auto* phi : block->phis()) {
248 auto input = phi->inputs()[phi_index]; 249 auto input = phi->inputs()[phi_index];
249 CHECK(locations()->find(input) != locations()->end()); 250 CHECK(locations()->find(input) != locations()->end());
250 auto it = locations()->find(phi->output()); 251 auto it = locations()->find(phi->output());
251 CHECK(it != locations()->end()); 252 CHECK(it != locations()->end());
252 if (input->IsConstant()) { 253 if (input->IsConstant()) {
253 CHECK_EQ(it->second, input->index()); 254 CHECK_EQ(it->second, input->index());
254 } else { 255 } else {
255 CHECK_EQ(it->second, phi->operands()[phi_index]); 256 CHECK_EQ(it->second, phi->operands()[phi_index]);
256 } 257 }
257 it->second = phi->virtual_register(); 258 it->second = phi->virtual_register();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 } 311 }
311 } 312 }
312 313
313 void InitializeFromFirstPredecessor(const InstructionSequence* sequence, 314 void InitializeFromFirstPredecessor(const InstructionSequence* sequence,
314 const OutgoingMappings* outgoing_mappings, 315 const OutgoingMappings* outgoing_mappings,
315 const InstructionBlock* block) { 316 const InstructionBlock* block) {
316 if (block->predecessors().empty()) return; 317 if (block->predecessors().empty()) return;
317 size_t predecessor_index = block->predecessors()[0].ToSize(); 318 size_t predecessor_index = block->predecessors()[0].ToSize();
318 CHECK(predecessor_index < block->rpo_number().ToSize()); 319 CHECK(predecessor_index < block->rpo_number().ToSize());
319 auto* incoming = outgoing_mappings->at(predecessor_index); 320 auto* incoming = outgoing_mappings->at(predecessor_index);
320 if (block->PredecessorCount() > 1) { 321 if (block->PredecessorCount() >= 1) {
321 // Update incoming map with phis. The remaining phis will be checked later 322 // Update incoming map with phis. The remaining phis will be checked later
322 // as their mappings are not guaranteed to exist yet. 323 // as their mappings are not guaranteed to exist yet.
323 incoming->RunPhis(sequence, block, 0); 324 incoming->RunPhis(sequence, block, 0);
324 } 325 }
325 // Now initialize outgoing mapping for this block with incoming mapping. 326 // Now initialize outgoing mapping for this block with incoming mapping.
326 CHECK(locations_.empty()); 327 CHECK(locations_.empty());
327 locations_ = incoming->locations_; 328 locations_ = incoming->locations_;
328 } 329 }
329 330
330 void InitializeFromIntersection() { locations_ = predecessor_intersection_; } 331 void InitializeFromIntersection() { locations_ = predecessor_intersection_; }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 const auto* gap = GapInstruction::cast(instr); 452 const auto* gap = GapInstruction::cast(instr);
452 current->RunGapInstruction(zone(), gap); 453 current->RunGapInstruction(zone(), gap);
453 } 454 }
454 } 455 }
455 } 456 }
456 } 457 }
457 458
458 } // namespace compiler 459 } // namespace compiler
459 } // namespace internal 460 } // namespace internal
460 } // namespace v8 461 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698