1 // Copyright 2019 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/compiler/scheduled-machine-lowering.h"
6
7 #include "src/compiler/compiler-source-position-table.h"
8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/node-origin-table.h"
10 #include "src/compiler/node-properties.h"
11 #include "src/compiler/schedule.h"
12
13 namespace v8 {
14 namespace internal {
15 namespace compiler {
16
ScheduledMachineLowering(JSGraph * js_graph,Schedule * schedule,Zone * temp_zone,SourcePositionTable * source_positions,NodeOriginTable * node_origins,PoisoningMitigationLevel poison_level)17 ScheduledMachineLowering::ScheduledMachineLowering(
18 JSGraph* js_graph, Schedule* schedule, Zone* temp_zone,
19 SourcePositionTable* source_positions, NodeOriginTable* node_origins,
20 PoisoningMitigationLevel poison_level)
21 : schedule_(schedule),
22 graph_assembler_(js_graph, temp_zone, base::nullopt, schedule),
23 select_lowering_(&graph_assembler_, js_graph->graph()),
24 memory_lowering_(js_graph, temp_zone, &graph_assembler_, poison_level),
25 reducers_({&select_lowering_, &memory_lowering_}, temp_zone),
26 source_positions_(source_positions),
27 node_origins_(node_origins) {}
28
Run()29 void ScheduledMachineLowering::Run() {
30 // TODO(rmcilroy) We should not depend on having rpo_order on schedule, and
31 // instead just do our own RPO walk here.
32 for (BasicBlock* block : *(schedule()->rpo_order())) {
33 BasicBlock::iterator instr = block->begin();
34 BasicBlock::iterator end_instr = block->end();
35 gasm()->Reset(block);
36
37 for (; instr != end_instr; instr++) {
38 Node* node = *instr;
39 Reduction reduction;
40 for (auto reducer : reducers_) {
41 reduction = reducer->Reduce(node);
42 if (reduction.Changed()) break;
43 }
44 if (reduction.Changed()) {
45 Node* replacement = reduction.replacement();
46 if (replacement != node) {
47 // Replace all uses of node and kill the node to make sure we don't
48 // leave dangling dead uses.
49 NodeProperties::ReplaceUses(node, replacement, gasm()->effect(),
50 gasm()->control());
51 node->Kill();
52 } else {
53 gasm()->AddNode(replacement);
54 }
55 } else {
56 gasm()->AddNode(node);
57 }
58 }
59
60 gasm()->FinalizeCurrentBlock(block);
61 }
62
63 schedule_->rpo_order()->clear();
64 }
65
66 } // namespace compiler
67 } // namespace internal
68 } // namespace v8
69