Index: runtime/vm/flow_graph_optimizer.h |
=================================================================== |
--- runtime/vm/flow_graph_optimizer.h (revision 42566) |
+++ runtime/vm/flow_graph_optimizer.h (working copy) |
@@ -316,83 +316,6 @@ |
}; |
-// Sparse conditional constant propagation and unreachable code elimination. |
-// Assumes that use lists are computed and preserves them. |
-class ConstantPropagator : public FlowGraphVisitor { |
- public: |
- ConstantPropagator(FlowGraph* graph, |
- const GrowableArray<BlockEntryInstr*>& ignored); |
- |
- static void Optimize(FlowGraph* graph); |
- |
- // (1) Visit branches to optimize away unreachable blocks discovered by range |
- // analysis. |
- // (2) Eliminate branches that have the same true- and false-target: For |
- // example, this occurs after expressions like |
- // |
- // if (a == null || b == null) { |
- // ... |
- // } |
- // |
- // where b is known to be null. |
- static void OptimizeBranches(FlowGraph* graph); |
- |
- // Used to initialize the abstract value of definitions. |
- static RawObject* Unknown() { return Object::unknown_constant().raw(); } |
- |
- private: |
- void Analyze(); |
- void Transform(); |
- void EliminateRedundantBranches(); |
- |
- void SetReachable(BlockEntryInstr* block); |
- bool SetValue(Definition* definition, const Object& value); |
- |
- Definition* UnwrapPhi(Definition* defn); |
- void MarkPhi(Definition* defn); |
- |
- // Assign the join (least upper bound) of a pair of abstract values to the |
- // first one. |
- void Join(Object* left, const Object& right); |
- |
- bool IsUnknown(const Object& value) { |
- return value.raw() == unknown_.raw(); |
- } |
- bool IsNonConstant(const Object& value) { |
- return value.raw() == non_constant_.raw(); |
- } |
- bool IsConstant(const Object& value) { |
- return !IsNonConstant(value) && !IsUnknown(value); |
- } |
- |
- void VisitBinaryIntegerOp(BinaryIntegerOpInstr* binary_op); |
- |
- virtual void VisitBlocks() { UNREACHABLE(); } |
- |
-#define DECLARE_VISIT(type) virtual void Visit##type(type##Instr* instr); |
- FOR_EACH_INSTRUCTION(DECLARE_VISIT) |
-#undef DECLARE_VISIT |
- |
- Isolate* isolate() const { return graph_->isolate(); } |
- |
- FlowGraph* graph_; |
- |
- // Sentinels for unknown constant and non-constant values. |
- const Object& unknown_; |
- const Object& non_constant_; |
- |
- // Analysis results. For each block, a reachability bit. Indexed by |
- // preorder number. |
- BitVector* reachable_; |
- |
- BitVector* marked_phis_; |
- |
- // Worklists of blocks and definitions. |
- GrowableArray<BlockEntryInstr*> block_worklist_; |
- DefinitionWorklist definition_worklist_; |
-}; |
- |
- |
// Rewrite branches to eliminate materialization of boolean values after |
// inlining, and to expose other optimizations (e.g., constant folding of |
// branches, unreachable code elimination). |