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

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

Issue 1634093002: [turbofan] fine grained in-block move optimization (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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 | « src/compiler/move-optimizer.cc ('k') | test/unittests/compiler/move-optimizer-unittest.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 3321 matching lines...) Expand 10 before | Expand all | Expand 10 after
3332 FindResult result; 3332 FindResult result;
3333 const InstructionBlock* pred_block = code()->InstructionBlockAt(pred); 3333 const InstructionBlock* pred_block = code()->InstructionBlockAt(pred);
3334 if (!array->FindConnectableSubranges(block, pred_block, &result)) { 3334 if (!array->FindConnectableSubranges(block, pred_block, &result)) {
3335 continue; 3335 continue;
3336 } 3336 }
3337 InstructionOperand pred_op = result.pred_cover_->GetAssignedOperand(); 3337 InstructionOperand pred_op = result.pred_cover_->GetAssignedOperand();
3338 InstructionOperand cur_op = result.cur_cover_->GetAssignedOperand(); 3338 InstructionOperand cur_op = result.cur_cover_->GetAssignedOperand();
3339 if (pred_op.Equals(cur_op)) continue; 3339 if (pred_op.Equals(cur_op)) continue;
3340 if (!pred_op.IsAnyRegister() && cur_op.IsAnyRegister()) { 3340 if (!pred_op.IsAnyRegister() && cur_op.IsAnyRegister()) {
3341 // We're doing a reload. 3341 // We're doing a reload.
3342 // We don't need to, if:
3343 // 1) there's no register use in this block, and
3344 // 2) the range ends before the block does, and
3345 // 3) we don't have a successor, or the successor is spilled.
3346 LifetimePosition block_start =
3347 LifetimePosition::GapFromInstructionIndex(block->code_start());
3348 LifetimePosition block_end =
3349 LifetimePosition::GapFromInstructionIndex(block->code_end());
3342 const LiveRange* current = result.cur_cover_; 3350 const LiveRange* current = result.cur_cover_;
3351 const LiveRange* successor = current->next();
3352 if (current->End() < block_end &&
3353 (successor == nullptr || successor->spilled())) {
3354 // verify point 1: no register use. We can go to the end of the
3355 // range, since it's all within the block.
3343 3356
3357 bool uses_reg = false;
3358 for (const UsePosition* use = current->NextUsePosition(block_start);
3359 use != nullptr; use = use->next()) {
3360 if (use->operand()->IsAnyRegister()) {
3361 uses_reg = true;
3362 break;
3363 }
3364 }
3365 if (!uses_reg) continue;
3366 }
3344 if (current->TopLevel()->IsSpilledOnlyInDeferredBlocks() && 3367 if (current->TopLevel()->IsSpilledOnlyInDeferredBlocks() &&
3345 pred_block->IsDeferred()) { 3368 pred_block->IsDeferred()) {
3346 // The spill location should be defined in pred_block, so add 3369 // The spill location should be defined in pred_block, so add
3347 // pred_block to the list of blocks requiring a spill operand. 3370 // pred_block to the list of blocks requiring a spill operand.
3348 current->TopLevel()->GetListOfBlocksRequiringSpillOperands()->Add( 3371 current->TopLevel()->GetListOfBlocksRequiringSpillOperands()->Add(
3349 pred_block->rpo_number().ToInt()); 3372 pred_block->rpo_number().ToInt());
3350 } 3373 }
3351 } 3374 }
3352 int move_loc = ResolveControlFlow(block, cur_op, pred_block, pred_op); 3375 int move_loc = ResolveControlFlow(block, cur_op, pred_block, pred_op);
3353 USE(move_loc); 3376 USE(move_loc);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
3552 spill_operand); 3575 spill_operand);
3553 } 3576 }
3554 } 3577 }
3555 } 3578 }
3556 } 3579 }
3557 3580
3558 3581
3559 } // namespace compiler 3582 } // namespace compiler
3560 } // namespace internal 3583 } // namespace internal
3561 } // namespace v8 3584 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/move-optimizer.cc ('k') | test/unittests/compiler/move-optimizer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698