// Copyright 2015 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.

#ifndef V8_COMPILER_CONTROL_FLOW_OPTIMIZER_H_
#define V8_COMPILER_CONTROL_FLOW_OPTIMIZER_H_

#include "src/common/globals.h"
#include "src/compiler/node-marker.h"
#include "src/zone/zone-containers.h"

namespace v8 {
namespace internal {

class TickCounter;

namespace compiler {

// Forward declarations.
class CommonOperatorBuilder;
class Graph;
class MachineOperatorBuilder;
class Node;

class V8_EXPORT_PRIVATE ControlFlowOptimizer final {
 public:
  ControlFlowOptimizer(Graph* graph, CommonOperatorBuilder* common,
                       MachineOperatorBuilder* machine,
                       TickCounter* tick_counter, Zone* zone);
  ControlFlowOptimizer(const ControlFlowOptimizer&) = delete;
  ControlFlowOptimizer& operator=(const ControlFlowOptimizer&) = delete;

  void Optimize();

 private:
  void Enqueue(Node* node);
  void VisitNode(Node* node);
  void VisitBranch(Node* node);

  bool TryBuildSwitch(Node* node);
  bool TryCloneBranch(Node* node);

  Graph* graph() const { return graph_; }
  CommonOperatorBuilder* common() const { return common_; }
  MachineOperatorBuilder* machine() const { return machine_; }
  Zone* zone() const { return zone_; }

  Graph* const graph_;
  CommonOperatorBuilder* const common_;
  MachineOperatorBuilder* const machine_;
  ZoneQueue<Node*> queue_;
  NodeMarker<bool> queued_;
  Zone* const zone_;
  TickCounter* const tick_counter_;
};

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_CONTROL_FLOW_OPTIMIZER_H_
