Index: runtime/vm/flow_graph_optimizer.cc |
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc |
index 77acf6585010dcd83dee379522efd1681e15659e..312416df9bc9fe63f5474999f92e6848825d391c 100644 |
--- a/runtime/vm/flow_graph_optimizer.cc |
+++ b/runtime/vm/flow_graph_optimizer.cc |
@@ -7641,6 +7641,13 @@ void ConstantPropagator::VisitTargetEntry(TargetEntryInstr* block) { |
} |
+void ConstantPropagator::VisitIndirectEntry(IndirectEntryInstr* block) { |
+ for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { |
+ it.Current()->Accept(this); |
+ } |
+} |
+ |
+ |
void ConstantPropagator::VisitCatchBlockEntry(CatchBlockEntryInstr* block) { |
const GrowableArray<Definition*>& defs = *block->initial_definitions(); |
for (intptr_t i = 0; i < defs.length(); ++i) { |
@@ -7688,6 +7695,13 @@ void ConstantPropagator::VisitGoto(GotoInstr* instr) { |
} |
+void ConstantPropagator::VisitIndirectGoto(IndirectGotoInstr* instr) { |
+ for (intptr_t i = 0; i < instr->SuccessorCount(); i++) { |
+ SetReachable(instr->SuccessorAt(i)); |
+ } |
+} |
+ |
+ |
void ConstantPropagator::VisitBranch(BranchInstr* instr) { |
instr->comparison()->Accept(this); |
@@ -8150,6 +8164,12 @@ void ConstantPropagator::VisitLoadIndexed(LoadIndexedInstr* instr) { |
} |
+void ConstantPropagator::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) { |
+ // TODO(zerny): Implement constant propagation. |
+ SetValue(instr, non_constant_); |
+} |
+ |
+ |
void ConstantPropagator::VisitStoreIndexed(StoreIndexedInstr* instr) { |
SetValue(instr, instr->value()->definition()->constant_value()); |
} |
@@ -8792,6 +8812,12 @@ void ConstantPropagator::VisitMathMinMax(MathMinMaxInstr* instr) { |
} |
+void ConstantPropagator::VisitCaseInsensitiveCompareUC16( |
+ CaseInsensitiveCompareUC16Instr *instr) { |
+ SetValue(instr, non_constant_); |
+} |
+ |
+ |
void ConstantPropagator::VisitUnbox(UnboxInstr* instr) { |
const Object& value = instr->value()->definition()->constant_value(); |
if (IsNonConstant(value)) { |
@@ -8874,7 +8900,8 @@ void ConstantPropagator::Analyze() { |
static bool IsEmptyBlock(BlockEntryInstr* block) { |
return block->next()->IsGoto() && |
- (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL)); |
+ (!block->IsJoinEntry() || (block->AsJoinEntry()->phis() == NULL)) && |
+ !block->IsIndirectEntry(); |
} |