Index: runtime/vm/intermediate_language_dbc.cc |
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc |
index 7b9dfc311a2778214c3a17e775b862f035c3ea1e..7ada86f52d5e67ebf605a604f2210bab2ba2de24 100644 |
--- a/runtime/vm/intermediate_language_dbc.cc |
+++ b/runtime/vm/intermediate_language_dbc.cc |
@@ -101,6 +101,7 @@ DECLARE_FLAG(int, optimization_counter_threshold); |
// List of instructions that are not used by DBC. |
#define FOR_EACH_UNREACHABLE_INSTRUCTION(M) \ |
M(CaseInsensitiveCompareUC16) \ |
+ M(GenericCheckBound) \ |
M(GrowRegExpStack) \ |
M(IndirectGoto) |
@@ -1350,6 +1351,14 @@ void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
EMIT_NATIVE_CODE(CheckArrayBound, 2) { |
const Register length = locs()->in(kLengthPos).reg(); |
const Register index = locs()->in(kIndexPos).reg(); |
+ const intptr_t index_cid = this->index()->Type()->ToCid(); |
+ if (index_cid != kSmiCid) { |
+ __ CheckSmi(index); |
+ compiler->EmitDeopt(deopt_id(), |
+ ICData::kDeoptCheckArrayBound, |
+ (generalized_ ? ICData::kGeneralized : 0) | |
+ (licm_hoisted_ ? ICData::kHoisted : 0)); |
+ } |
__ IfULe(length, index); |
compiler->EmitDeopt(deopt_id(), |
ICData::kDeoptCheckArrayBound, |