blob: 060fed827437518adb0a7eac20e396274384ebe4 [file] [log] [blame]
// 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_