| Index: runtime/vm/flow_graph_compiler_x64.cc | 
| diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc | 
| index d9a11c4c258f9a5043f1e0abb8cfd022296070e1..e044923a6cbfce33366e5aad8c97bcfe8df471e3 100644 | 
| --- a/runtime/vm/flow_graph_compiler_x64.cc | 
| +++ b/runtime/vm/flow_graph_compiler_x64.cc | 
| @@ -1534,7 +1534,8 @@ void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data, | 
| Label* match_found, | 
| intptr_t deopt_id, | 
| TokenPosition token_index, | 
| -                                        LocationSummary* locs) { | 
| +                                        LocationSummary* locs, | 
| +                                        bool complete) { | 
| ASSERT(is_optimizing()); | 
|  | 
| __ Comment("EmitTestAndCall"); | 
| @@ -1552,8 +1553,8 @@ void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data, | 
| ASSERT(!ic_data.IsNull() && (kNumChecks > 0)); | 
|  | 
| Label after_smi_test; | 
| -  __ testq(RAX, Immediate(kSmiTagMask)); | 
| if (kFirstCheckIsSmi) { | 
| +    __ testq(RAX, Immediate(kSmiTagMask)); | 
| // Jump if receiver is not Smi. | 
| if (kNumChecks == 1) { | 
| __ j(NOT_ZERO, failed); | 
| @@ -1577,7 +1578,10 @@ void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data, | 
| } else { | 
| // Receiver is Smi, but Smi is not a valid class therefore fail. | 
| // (Smi class must be first in the list). | 
| -    __ j(ZERO, failed); | 
| +    if (!complete) { | 
| +      __ testq(RAX, Immediate(kSmiTagMask)); | 
| +      __ j(ZERO, failed); | 
| +    } | 
| } | 
| __ Bind(&after_smi_test); | 
|  | 
| @@ -1596,11 +1600,18 @@ void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data, | 
| const bool kIsLastCheck = (i == (kSortedLen - 1)); | 
| ASSERT(sorted[i].cid != kSmiCid); | 
| Label next_test; | 
| -    __ cmpl(RDI, Immediate(sorted[i].cid)); | 
| -    if (kIsLastCheck) { | 
| -      __ j(NOT_EQUAL, failed); | 
| +    if (!complete) { | 
| +      __ cmpl(RDI, Immediate(sorted[i].cid)); | 
| +      if (kIsLastCheck) { | 
| +        __ j(NOT_EQUAL, failed); | 
| +      } else { | 
| +        __ j(NOT_EQUAL, &next_test); | 
| +      } | 
| } else { | 
| -      __ j(NOT_EQUAL, &next_test); | 
| +      if (!kIsLastCheck) { | 
| +        __ cmpl(RDI, Immediate(sorted[i].cid)); | 
| +        __ j(NOT_EQUAL, &next_test); | 
| +      } | 
| } | 
| // Do not use the code from the function, but let the code be patched so | 
| // that we can record the outgoing edges to other code. | 
|  |