| Index: runtime/vm/flow_graph_optimizer.cc
|
| diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
|
| index 82fe8947be277db2215c8c5383c34e33f8aa7bd2..2ed1b2958603e9cce977131567cf43af74a9c513 100644
|
| --- a/runtime/vm/flow_graph_optimizer.cc
|
| +++ b/runtime/vm/flow_graph_optimizer.cc
|
| @@ -4567,6 +4567,15 @@ void FlowGraphOptimizer::VisitAllocateContext(AllocateContextInstr* instr) {
|
| }
|
|
|
|
|
| +void FlowGraphOptimizer::VisitLoadCodeUnits(LoadCodeUnitsInstr* instr) {
|
| + // TODO(zerny): Use kUnboxedUint32 once it is fully supported/optimized.
|
| +#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
|
| + if (!instr->can_pack_into_smi())
|
| + instr->set_representation(kUnboxedMint);
|
| +#endif
|
| +}
|
| +
|
| +
|
| bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
|
| const ICData& unary_ic_data) {
|
| ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
|
| @@ -7590,6 +7599,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) {
|
| @@ -7637,6 +7653,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);
|
|
|
| @@ -8099,6 +8122,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());
|
| }
|
| @@ -8741,6 +8770,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)) {
|
| @@ -8823,7 +8858,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();
|
| }
|
|
|
|
|
|
|