| 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).
|
|
|