blob: 9b6e02dfae534f81cdb3d78fcda05768009ece38 [file] [log] [blame]
// Copyright (c) 2013, 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_FLOW_GRAPH_TYPE_PROPAGATOR_H_
#define VM_FLOW_GRAPH_TYPE_PROPAGATOR_H_
#include "vm/flow_graph.h"
#include "vm/intermediate_language.h"
namespace dart {
class FlowGraphTypePropagator : public FlowGraphVisitor {
public:
explicit FlowGraphTypePropagator(FlowGraph* flow_graph);
void Propagate();
private:
void PropagateRecursive(BlockEntryInstr* block);
void HandleBranchOnNull(BlockEntryInstr* block);
void RollbackTo(intptr_t rollback_point);
void VisitValue(Value* value);
virtual void VisitJoinEntry(JoinEntryInstr* instr);
virtual void VisitCheckSmi(CheckSmiInstr* instr);
virtual void VisitCheckClass(CheckClassInstr* instr);
virtual void VisitGuardField(GuardFieldInstr* instr);
// Current reaching type of the definition. Valid only during dominator tree
// traversal.
CompileType* TypeOf(Definition* def);
// Mark definition as having given compile type in all dominated instructions.
void SetTypeOf(Definition* def, CompileType* type);
// Mark definition as having given class id in all dominated instructions.
void SetCid(Definition* value, intptr_t cid);
ConstrainedCompileType* MarkNonNullable(Definition* value);
void AddToWorklist(Definition* defn);
Definition* RemoveLastFromWorklist();
// Type assertion strengthening.
void StrengthenAsserts(BlockEntryInstr* block);
void StrengthenAssertWith(Instruction* check);
FlowGraph* flow_graph_;
BitVector* visited_blocks_;
// Mapping between SSA values and their current reaching types. Valid
// only during dominator tree traversal.
GrowableArray<CompileType*> types_;
// Worklist for fixpoint computation.
GrowableArray<Definition*> worklist_;
BitVector* in_worklist_;
ZoneGrowableArray<AssertAssignableInstr*>* asserts_;
ZoneGrowableArray<intptr_t>* collected_asserts_;
// RollbackEntry is used to track and rollback changed in the types_ array
// done during dominator tree traversal.
class RollbackEntry {
public:
// Default constructor needed for the container.
RollbackEntry()
: index_(), type_() {
}
RollbackEntry(intptr_t index, CompileType* type)
: index_(index), type_(type) {
}
intptr_t index() const { return index_; }
CompileType* type() const { return type_; }
private:
intptr_t index_;
CompileType* type_;
};
GrowableArray<RollbackEntry> rollback_;
};
} // namespace dart
#endif // VM_FLOW_GRAPH_TYPE_PROPAGATOR_H_