Files
sdk/runtime/vm/branch_optimizer.h
T
Florian Schneider ce4d687279 VM: Move branch optimizations into a separate file.
Move optimizations that are always shared between JIT and precompiler
into separate files.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/1679833002 .
2016-02-08 16:44:13 +01:00

57 lines
1.8 KiB
C++

// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef VM_BRANCH_OPTIMIZER_H_
#define VM_BRANCH_OPTIMIZER_H_
#include "vm/allocation.h"
namespace dart {
class FlowGraph;
class JoinEntryInstr;
class Zone;
class TargetEntryInstr;
class Value;
class BranchInstr;
// Rewrite branches to eliminate materialization of boolean values after
// inlining, and to expose other optimizations (e.g., constant folding of
// branches, unreachable code elimination).
class BranchSimplifier : public AllStatic {
public:
static void Simplify(FlowGraph* flow_graph);
// Replace a target entry instruction with a join entry instruction. Does
// not update the original target's predecessors to point to the new block
// and does not replace the target in already computed block order lists.
static JoinEntryInstr* ToJoinEntry(Zone* zone,
TargetEntryInstr* target);
private:
// Match an instance of the pattern to rewrite. See the implementation
// for the patterns that are handled by this pass.
static bool Match(JoinEntryInstr* block);
// Duplicate a branch while replacing its comparison's left and right
// inputs.
static BranchInstr* CloneBranch(Zone* zone,
BranchInstr* branch,
Value* new_left,
Value* new_right);
};
// Rewrite diamond control flow patterns that materialize values to use more
// efficient branchless code patterns if such are supported on the current
// platform.
class IfConverter : public AllStatic {
public:
static void Simplify(FlowGraph* flow_graph);
};
} // namespace dart
#endif // VM_BRANCH_OPTIMIZER_H_