diff options
Diffstat (limited to 'deps/v8/src/compiler/select-lowering.cc')
-rw-r--r-- | deps/v8/src/compiler/select-lowering.cc | 53 |
1 files changed, 4 insertions, 49 deletions
diff --git a/deps/v8/src/compiler/select-lowering.cc b/deps/v8/src/compiler/select-lowering.cc index 0e8b36fa73..b1a230962f 100644 --- a/deps/v8/src/compiler/select-lowering.cc +++ b/deps/v8/src/compiler/select-lowering.cc @@ -15,10 +15,7 @@ namespace internal { namespace compiler { SelectLowering::SelectLowering(Graph* graph, CommonOperatorBuilder* common) - : common_(common), - graph_(graph), - merges_(Merges::key_compare(), Merges::allocator_type(graph->zone())) {} - + : common_(common), graph_(graph) {} SelectLowering::~SelectLowering() {} @@ -30,58 +27,16 @@ Reduction SelectLowering::Reduce(Node* node) { Node* cond = node->InputAt(0); Node* vthen = node->InputAt(1); Node* velse = node->InputAt(2); - Node* merge = nullptr; - - // Check if we already have a diamond for this condition. - auto range = merges_.equal_range(cond); - for (auto i = range.first;; ++i) { - if (i == range.second) { - // Create a new diamond for this condition and remember its merge node. - Diamond d(graph(), common(), cond, p.hint()); - merges_.insert(std::make_pair(cond, d.merge)); - merge = d.merge; - break; - } - - // If the diamond is reachable from the Select, merging them would result in - // an unschedulable graph, so we cannot reuse the diamond in that case. - merge = i->second; - if (!ReachableFrom(merge, node)) { - break; - } - } - // Create a Phi hanging off the previously determined merge. + // Create a diamond and a phi. + Diamond d(graph(), common(), cond, p.hint()); node->ReplaceInput(0, vthen); node->ReplaceInput(1, velse); - node->ReplaceInput(2, merge); + node->ReplaceInput(2, d.merge); NodeProperties::ChangeOp(node, common()->Phi(p.representation(), 2)); return Changed(node); } - -bool SelectLowering::ReachableFrom(Node* const sink, Node* const source) { - // TODO(turbofan): This is probably horribly expensive, and it should be moved - // into node.h or somewhere else?! - Zone zone; - std::queue<Node*, NodeDeque> queue((NodeDeque(&zone))); - BoolVector visited(graph()->NodeCount(), false, &zone); - queue.push(source); - visited[source->id()] = true; - while (!queue.empty()) { - Node* current = queue.front(); - if (current == sink) return true; - queue.pop(); - for (auto input : current->inputs()) { - if (!visited[input->id()]) { - queue.push(input); - visited[input->id()] = true; - } - } - } - return false; -} - } // namespace compiler } // namespace internal } // namespace v8 |