| Index: src/compiler/instruction-scheduler.cc
|
| diff --git a/src/compiler/instruction-scheduler.cc b/src/compiler/instruction-scheduler.cc
|
| index 478246c155b076af7837ba6ded4e4a3932c4f578..2e10794d69d6f829fe096bf82d0d3d407ff10a66 100644
|
| --- a/src/compiler/instruction-scheduler.cc
|
| +++ b/src/compiler/instruction-scheduler.cc
|
| @@ -83,8 +83,8 @@ InstructionScheduler::InstructionScheduler(Zone* zone,
|
| last_side_effect_instr_(nullptr),
|
| pending_loads_(zone),
|
| last_live_in_reg_marker_(nullptr),
|
| - last_deopt_(nullptr) {
|
| -}
|
| + last_deopt_(nullptr),
|
| + operands_map_(zone) {}
|
|
|
|
|
| void InstructionScheduler::StartBlock(RpoNumber rpo) {
|
| @@ -93,6 +93,7 @@ void InstructionScheduler::StartBlock(RpoNumber rpo) {
|
| DCHECK(pending_loads_.empty());
|
| DCHECK(last_live_in_reg_marker_ == nullptr);
|
| DCHECK(last_deopt_ == nullptr);
|
| + DCHECK(operands_map_.empty());
|
| sequence()->StartBlock(rpo);
|
| }
|
|
|
| @@ -109,6 +110,7 @@ void InstructionScheduler::EndBlock(RpoNumber rpo) {
|
| pending_loads_.clear();
|
| last_live_in_reg_marker_ = nullptr;
|
| last_deopt_ = nullptr;
|
| + operands_map_.clear();
|
| }
|
|
|
|
|
| @@ -165,9 +167,26 @@ void InstructionScheduler::AddInstruction(Instruction* instr) {
|
| }
|
|
|
| // Look for operand dependencies.
|
| - for (ScheduleGraphNode* node : graph_) {
|
| - if (HasOperandDependency(node->instruction(), instr)) {
|
| - node->AddSuccessor(new_node);
|
| + for (size_t i = 0; i < instr->InputCount(); ++i) {
|
| + const InstructionOperand* input = instr->InputAt(i);
|
| + if (input->IsUnallocated()) {
|
| + int32_t vreg = UnallocatedOperand::cast(input)->virtual_register();
|
| + auto it = operands_map_.find(vreg);
|
| + if (it != operands_map_.end()) {
|
| + it->second->AddSuccessor(new_node);
|
| + }
|
| + }
|
| + }
|
| +
|
| + // Record the virtual registers defined by this instruction.
|
| + for (size_t i = 0; i < instr->OutputCount(); ++i) {
|
| + const InstructionOperand* output = instr->OutputAt(i);
|
| + if (output->IsUnallocated()) {
|
| + operands_map_[UnallocatedOperand::cast(output)->virtual_register()] =
|
| + new_node;
|
| + } else if (output->IsConstant()) {
|
| + operands_map_[ConstantOperand::cast(output)->virtual_register()] =
|
| + new_node;
|
| }
|
| }
|
| }
|
| @@ -317,33 +336,6 @@ int InstructionScheduler::GetInstructionFlags(const Instruction* instr) const {
|
| }
|
|
|
|
|
| -bool InstructionScheduler::HasOperandDependency(
|
| - const Instruction* instr1, const Instruction* instr2) const {
|
| - for (size_t i = 0; i < instr1->OutputCount(); ++i) {
|
| - for (size_t j = 0; j < instr2->InputCount(); ++j) {
|
| - const InstructionOperand* output = instr1->OutputAt(i);
|
| - const InstructionOperand* input = instr2->InputAt(j);
|
| -
|
| - if (output->IsUnallocated() && input->IsUnallocated() &&
|
| - (UnallocatedOperand::cast(output)->virtual_register() ==
|
| - UnallocatedOperand::cast(input)->virtual_register())) {
|
| - return true;
|
| - }
|
| -
|
| - if (output->IsConstant() && input->IsUnallocated() &&
|
| - (ConstantOperand::cast(output)->virtual_register() ==
|
| - UnallocatedOperand::cast(input)->virtual_register())) {
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // TODO(bafsa): Do we need to look for anti-dependencies/output-dependencies?
|
| -
|
| - return false;
|
| -}
|
| -
|
| -
|
| bool InstructionScheduler::IsBlockTerminator(const Instruction* instr) const {
|
| return ((GetInstructionFlags(instr) & kIsBlockTerminator) ||
|
| (instr->flags_mode() == kFlags_branch));
|
|
|