| 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();
|
| }
|
|
|
|
|
|
|