| Index: runtime/vm/flow_graph_optimizer.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_optimizer.cc (revision 30082)
|
| +++ runtime/vm/flow_graph_optimizer.cc (working copy)
|
| @@ -6313,14 +6313,28 @@
|
| (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
|
| bool result = left.IsNull() ? instr->right()->Type()->IsNull()
|
| : instr->left()->Type()->IsNull();
|
| - if (instr->kind() == Token::kNE_STRICT) result = !result;
|
| + if (instr->kind() == Token::kNE_STRICT) {
|
| + result = !result;
|
| + }
|
| SetValue(instr, Bool::Get(result));
|
| } else {
|
| - SetValue(instr, non_constant_);
|
| + const intptr_t left_cid = instr->left()->Type()->ToCid();
|
| + const intptr_t right_cid = instr->right()->Type()->ToCid();
|
| + // If exact classes (cids) are known and they differ, the result
|
| + // of strict compare can be computed.
|
| + if ((left_cid != kDynamicCid) && (right_cid != kDynamicCid) &&
|
| + (left_cid != right_cid)) {
|
| + const bool result = (instr->kind() != Token::kEQ_STRICT);
|
| + SetValue(instr, Bool::Get(result));
|
| + } else {
|
| + SetValue(instr, non_constant_);
|
| + }
|
| }
|
| } else if (IsConstant(left) && IsConstant(right)) {
|
| bool result = (left.raw() == right.raw());
|
| - if (instr->kind() == Token::kNE_STRICT) result = !result;
|
| + if (instr->kind() == Token::kNE_STRICT) {
|
| + result = !result;
|
| + }
|
| SetValue(instr, Bool::Get(result));
|
| }
|
| }
|
|
|