| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/compiler/scheduled-machine-lowering.h" |
| |
| #include "src/compiler/compiler-source-position-table.h" |
| #include "src/compiler/js-graph.h" |
| #include "src/compiler/node-origin-table.h" |
| #include "src/compiler/node-properties.h" |
| #include "src/compiler/schedule.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| ScheduledMachineLowering::ScheduledMachineLowering( |
| JSGraph* js_graph, Schedule* schedule, Zone* temp_zone, |
| SourcePositionTable* source_positions, NodeOriginTable* node_origins, |
| PoisoningMitigationLevel poison_level) |
| : schedule_(schedule), |
| graph_assembler_(js_graph, temp_zone, base::nullopt, schedule), |
| select_lowering_(&graph_assembler_, js_graph->graph()), |
| memory_lowering_(js_graph, temp_zone, &graph_assembler_, poison_level), |
| reducers_({&select_lowering_, &memory_lowering_}, temp_zone), |
| source_positions_(source_positions), |
| node_origins_(node_origins) {} |
| |
| void ScheduledMachineLowering::Run() { |
| // TODO(rmcilroy) We should not depend on having rpo_order on schedule, and |
| // instead just do our own RPO walk here. |
| for (BasicBlock* block : *(schedule()->rpo_order())) { |
| BasicBlock::iterator instr = block->begin(); |
| BasicBlock::iterator end_instr = block->end(); |
| gasm()->Reset(block); |
| |
| for (; instr != end_instr; instr++) { |
| Node* node = *instr; |
| Reduction reduction; |
| for (auto reducer : reducers_) { |
| reduction = reducer->Reduce(node); |
| if (reduction.Changed()) break; |
| } |
| if (reduction.Changed()) { |
| Node* replacement = reduction.replacement(); |
| if (replacement != node) { |
| // Replace all uses of node and kill the node to make sure we don't |
| // leave dangling dead uses. |
| NodeProperties::ReplaceUses(node, replacement, gasm()->effect(), |
| gasm()->control()); |
| node->Kill(); |
| } else { |
| gasm()->AddNode(replacement); |
| } |
| } else { |
| gasm()->AddNode(node); |
| } |
| } |
| |
| gasm()->FinalizeCurrentBlock(block); |
| } |
| |
| schedule_->rpo_order()->clear(); |
| } |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |