| Index: runtime/vm/flow_graph_type_propagator.cc
|
| diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
|
| index 2b7001f656104549b25930aefbf2c9124cc4f30f..0d646b873fe13ff5d5894b33226e08d522901908 100644
|
| --- a/runtime/vm/flow_graph_type_propagator.cc
|
| +++ b/runtime/vm/flow_graph_type_propagator.cc
|
| @@ -149,7 +149,7 @@ void FlowGraphTypePropagator::PropagateRecursive(BlockEntryInstr* block) {
|
| }
|
| }
|
|
|
| - HandleBranchOnNull(block);
|
| + HandleBranchOnStrictCompare(block);
|
|
|
| for (intptr_t i = 0; i < block->dominated_blocks().length(); ++i) {
|
| PropagateRecursive(block->dominated_blocks()[i]);
|
| @@ -159,7 +159,8 @@ void FlowGraphTypePropagator::PropagateRecursive(BlockEntryInstr* block) {
|
| }
|
|
|
|
|
| -void FlowGraphTypePropagator::HandleBranchOnNull(BlockEntryInstr* block) {
|
| +void FlowGraphTypePropagator::HandleBranchOnStrictCompare(
|
| + BlockEntryInstr* block) {
|
| BranchInstr* branch = block->last_instruction()->AsBranch();
|
| if (branch == NULL) {
|
| return;
|
| @@ -318,7 +319,9 @@ void FlowGraphTypePropagator::VisitCheckClassId(CheckClassIdInstr* check) {
|
| void FlowGraphTypePropagator::VisitGuardFieldClass(
|
| GuardFieldClassInstr* guard) {
|
| const intptr_t cid = guard->field().guarded_cid();
|
| - if ((cid == kIllegalCid) || (cid == kDynamicCid)) {
|
| + if ((cid == kIllegalCid) ||
|
| + (cid == kDynamicCid) ||
|
| + !CheckClassInstr::IsImmutableClassId(cid)) {
|
| return;
|
| }
|
|
|
| @@ -794,13 +797,17 @@ CompileType ConstantInstr::ComputeType() const {
|
| return CompileType::Null();
|
| }
|
|
|
| + intptr_t cid = value().GetClassId();
|
| + if (!CheckClassInstr::IsImmutableClassId(cid)) {
|
| + cid = kDynamicCid;
|
| + }
|
| +
|
| if (value().IsInstance()) {
|
| - return CompileType::Create(
|
| - value().GetClassId(),
|
| + return CompileType::Create(cid,
|
| AbstractType::ZoneHandle(Instance::Cast(value()).GetType()));
|
| } else {
|
| // Type info for non-instance objects.
|
| - return CompileType::FromCid(value().GetClassId());
|
| + return CompileType::FromCid(cid);
|
| }
|
| }
|
|
|
| @@ -974,6 +981,9 @@ CompileType LoadStaticFieldInstr::ComputeType() const {
|
| cid = obj.GetClassId();
|
| }
|
| }
|
| + if (!CheckClassInstr::IsImmutableClassId(cid)) {
|
| + cid = kDynamicCid;
|
| + }
|
| return CompileType(is_nullable, cid, abstract_type);
|
| }
|
|
|
|
|