| Index: runtime/vm/flow_graph_optimizer.cc
|
| diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
|
| index 709d42b2bfeded75b1dc6184e0c76e973690c6c5..e79cf76b6e59c8d72bc29ec06edadb921b726b5d 100644
|
| --- a/runtime/vm/flow_graph_optimizer.cc
|
| +++ b/runtime/vm/flow_graph_optimizer.cc
|
| @@ -7562,6 +7562,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) {
|
| @@ -7609,6 +7616,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);
|
|
|
| @@ -8017,6 +8031,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());
|
| }
|
| @@ -8659,6 +8679,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)) {
|
| @@ -8742,7 +8768,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();
|
| }
|
|
|
|
|
|
|