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

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

Issue 2030463003: [turbofan] Fix phi-hinting problem with deferred blocks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 6 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 | test/cctest/test-code-stub-assembler.cc » ('j') | 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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/linkage.h" 6 #include "src/compiler/linkage.h"
7 #include "src/compiler/register-allocator.h" 7 #include "src/compiler/register-allocator.h"
8 #include "src/string-stream.h" 8 #include "src/string-stream.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 2166 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 } 2177 }
2178 2178
2179 2179
2180 void LiveRangeBuilder::ProcessPhis(const InstructionBlock* block, 2180 void LiveRangeBuilder::ProcessPhis(const InstructionBlock* block,
2181 BitVector* live) { 2181 BitVector* live) {
2182 for (PhiInstruction* phi : block->phis()) { 2182 for (PhiInstruction* phi : block->phis()) {
2183 // The live range interval already ends at the first instruction of the 2183 // The live range interval already ends at the first instruction of the
2184 // block. 2184 // block.
2185 int phi_vreg = phi->virtual_register(); 2185 int phi_vreg = phi->virtual_register();
2186 live->Remove(phi_vreg); 2186 live->Remove(phi_vreg);
2187 InstructionOperand* hint = nullptr; 2187 // Select the hint from the first predecessor block that preceeds this block
2188 // in the rpo ordering. Prefer non-deferred blocks. The enforcement of
2189 // hinting in rpo order is required because hint resolution that happens
2190 // later in the compiler pipeline visits instructions in reverse rpo,
2191 // relying on the fact that phis are encountered before their hints.
2192 const Instruction* instr = nullptr;
2188 const InstructionBlock::Predecessors& predecessors = block->predecessors(); 2193 const InstructionBlock::Predecessors& predecessors = block->predecessors();
2189 const InstructionBlock* predecessor_block = 2194 for (size_t i = 0; i < predecessors.size(); ++i) {
2190 code()->InstructionBlockAt(predecessors[0]); 2195 const InstructionBlock* predecessor_block =
2191 const Instruction* instr = GetLastInstruction(code(), predecessor_block); 2196 code()->InstructionBlockAt(predecessors[i]);
2192 if (predecessor_block->IsDeferred()) { 2197 if (predecessor_block->rpo_number() < block->rpo_number()) {
2193 // "Prefer the hint from the first non-deferred predecessor, if any. 2198 instr = GetLastInstruction(code(), predecessor_block);
2194 for (size_t i = 1; i < predecessors.size(); ++i) { 2199 if (!predecessor_block->IsDeferred()) break;
2195 predecessor_block = code()->InstructionBlockAt(predecessors[i]);
2196 if (!predecessor_block->IsDeferred()) {
2197 instr = GetLastInstruction(code(), predecessor_block);
2198 break;
2199 }
2200 } 2200 }
2201 } 2201 }
2202 DCHECK_NOT_NULL(instr); 2202 DCHECK_NOT_NULL(instr);
2203 2203
2204 InstructionOperand* hint = nullptr;
2204 for (MoveOperands* move : *instr->GetParallelMove(Instruction::END)) { 2205 for (MoveOperands* move : *instr->GetParallelMove(Instruction::END)) {
2205 InstructionOperand& to = move->destination(); 2206 InstructionOperand& to = move->destination();
2206 if (to.IsUnallocated() && 2207 if (to.IsUnallocated() &&
2207 UnallocatedOperand::cast(to).virtual_register() == phi_vreg) { 2208 UnallocatedOperand::cast(to).virtual_register() == phi_vreg) {
2208 hint = &move->source(); 2209 hint = &move->source();
2209 break; 2210 break;
2210 } 2211 }
2211 } 2212 }
2212 DCHECK(hint != nullptr); 2213 DCHECK(hint != nullptr);
2213 LifetimePosition block_start = LifetimePosition::GapFromInstructionIndex( 2214 LifetimePosition block_start = LifetimePosition::GapFromInstructionIndex(
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after
3657 } 3658 }
3658 } 3659 }
3659 } 3660 }
3660 } 3661 }
3661 } 3662 }
3662 3663
3663 3664
3664 } // namespace compiler 3665 } // namespace compiler
3665 } // namespace internal 3666 } // namespace internal
3666 } // namespace v8 3667 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698