| Index: runtime/vm/flow_graph_optimizer.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_optimizer.cc (revision 10124)
|
| +++ runtime/vm/flow_graph_optimizer.cc (working copy)
|
| @@ -10,8 +10,10 @@
|
|
|
| namespace dart {
|
|
|
| +DECLARE_FLAG(bool, eliminate_type_checks);
|
| DECLARE_FLAG(bool, enable_type_checks);
|
| DECLARE_FLAG(bool, trace_optimization);
|
| +DECLARE_FLAG(bool, trace_type_check_elimination);
|
|
|
| void FlowGraphOptimizer::ApplyICData() {
|
| VisitBlocks();
|
| @@ -363,8 +365,6 @@
|
| }
|
|
|
|
|
| -
|
| -
|
| void FlowGraphOptimizer::VisitInstanceCall(InstanceCallComp* comp,
|
| BindInstr* instr) {
|
| if (comp->HasICData() && (comp->ic_data()->NumberOfChecks() > 0)) {
|
| @@ -441,7 +441,6 @@
|
| }
|
|
|
|
|
| -
|
| void FlowGraphOptimizer::VisitInstanceSetter(InstanceSetterComp* comp,
|
| BindInstr* instr) {
|
| // TODO(srdjan): Add assignable check node if --enable_type_checks.
|
| @@ -544,7 +543,30 @@
|
| }
|
|
|
|
|
| +void FlowGraphTypePropagator::VisitAssertAssignable(AssertAssignableComp* comp,
|
| + BindInstr* instr) {
|
| + if (FLAG_eliminate_type_checks &&
|
| + (comp->value() != NULL) &&
|
| + !comp->dst_type().IsMalformed() &&
|
| + comp->value()->StaticTypeIsMoreSpecificThan(comp->dst_type())) {
|
| + // TODO(regis): Eliminate type check by removing comp node from graph.
|
| + if (FLAG_trace_type_check_elimination) {
|
| + FlowGraphPrinter::PrintTypeCheck(parsed_function(),
|
| + comp->token_pos(),
|
| + comp->value(),
|
| + comp->dst_type(),
|
| + comp->dst_name(),
|
| + /*eliminated*/ true);
|
| + }
|
| + }
|
| +}
|
|
|
| +
|
| +void FlowGraphTypePropagator::VisitBind(BindInstr* instr) {
|
| + instr->computation()->Accept(this, instr);
|
| +}
|
| +
|
| +
|
| void FlowGraphAnalyzer::Analyze() {
|
| is_leaf_ = true;
|
| for (intptr_t i = 0; i < blocks_.length(); ++i) {
|
| @@ -559,4 +581,9 @@
|
| }
|
| }
|
|
|
| +
|
| +void FlowGraphTypePropagator::PropagateTypes() {
|
| + VisitBlocks();
|
| +}
|
| +
|
| } // namespace dart
|
|
|