| Index: src/compiler/select-lowering.cc
|
| diff --git a/src/compiler/select-lowering.cc b/src/compiler/select-lowering.cc
|
| index 44d040df046dbaf504706fa7cfa7b6490fa1d945..2e51d72024bb8f96e3f82850352b132c682209bd 100644
|
| --- a/src/compiler/select-lowering.cc
|
| +++ b/src/compiler/select-lowering.cc
|
| @@ -26,58 +26,26 @@ Reduction SelectLowering::Reduce(Node* node) {
|
| if (node->opcode() != IrOpcode::kSelect) return NoChange();
|
| SelectParameters const p = SelectParametersOf(node->op());
|
|
|
| - Node* cond = node->InputAt(0);
|
| - Node* vthen = node->InputAt(1);
|
| - Node* velse = node->InputAt(2);
|
| - Node* merge = nullptr;
|
| + Node* const cond = node->InputAt(0);
|
|
|
| // 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;
|
| - }
|
| + auto i = merges_.find(cond);
|
| + if (i == merges_.end()) {
|
| + // Create a new diamond for this condition and remember its merge node.
|
| + Diamond d(graph(), common(), cond, p.hint());
|
| + i = merges_.insert(std::make_pair(cond, d.merge)).first;
|
| }
|
|
|
| + DCHECK_EQ(cond, i->first);
|
| +
|
| // Create a Phi hanging off the previously determined merge.
|
| node->set_op(common()->Phi(p.type(), 2));
|
| - node->ReplaceInput(0, vthen);
|
| - node->ReplaceInput(1, velse);
|
| - node->ReplaceInput(2, merge);
|
| + node->ReplaceInput(0, node->InputAt(1));
|
| + node->ReplaceInput(1, node->InputAt(2));
|
| + node->ReplaceInput(2, i->second);
|
| 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(graph()->zone()->isolate());
|
| - std::queue<Node*, NodeDeque> pending((NodeDeque(&zone)));
|
| - BoolVector visited(graph()->NodeCount(), false, &zone);
|
| - pending.push(source);
|
| - while (!pending.empty()) {
|
| - Node* current = pending.front();
|
| - if (current == sink) return true;
|
| - pending.pop();
|
| - visited[current->id()] = true;
|
| - for (auto input : current->inputs()) {
|
| - if (!visited[input->id()]) pending.push(input);
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|