Index: runtime/vm/aot_optimizer.cc |
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc |
index ea444c0de86088e8ef351217ecbe072f4158100e..168471ceeb93252db7dae73defb027ad0ff5ddd1 100644 |
--- a/runtime/vm/aot_optimizer.cc |
+++ b/runtime/vm/aot_optimizer.cc |
@@ -209,11 +209,16 @@ bool AotOptimizer::TryCreateICData(InstanceCallInstr* call) { |
} |
const Token::Kind op_kind = call->token_kind(); |
- if (Token::IsRelationalOperator(op_kind) || |
- Token::IsEqualityOperator(op_kind) || Token::IsBinaryOperator(op_kind)) { |
- // Guess cid: if one of the inputs is a number assume that the other |
- // is a number of same type. |
- if (FLAG_guess_icdata_cid) { |
+ if (FLAG_guess_icdata_cid) { |
+ if (Token::IsBinaryBitwiseOperator(op_kind)) { |
+ class_ids[0] = kSmiCid; |
+ class_ids[1] = kSmiCid; |
+ } |
+ if (Token::IsRelationalOperator(op_kind) || |
+ Token::IsEqualityOperator(op_kind) || |
+ Token::IsBinaryOperator(op_kind)) { |
+ // Guess cid: if one of the inputs is a number assume that the other |
+ // is a number of same type. |
const intptr_t cid_0 = class_ids[0]; |
const intptr_t cid_1 = class_ids[1]; |
if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) { |
@@ -1796,6 +1801,8 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
} |
break; |
} |
+ case Token::kSHL: |
+ case Token::kSHR: |
case Token::kBIT_OR: |
case Token::kBIT_XOR: |
case Token::kBIT_AND: |