| Index: runtime/vm/compiler.cc | 
| diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc | 
| index 7685b3cc9ca637489d83babb67de9a6072ab4593..6fc4834dd1ef15ebe67c313fe65f67496976d213 100644 | 
| --- a/runtime/vm/compiler.cc | 
| +++ b/runtime/vm/compiler.cc | 
| @@ -613,6 +613,13 @@ NOT_IN_PRODUCT( | 
| THR_Print("--> FAIL: Loading invalidation."); | 
| } | 
| } | 
| +      if (!thread()->cha()->IsConsistentWithCurrentHierarchy()) { | 
| +        code_is_valid = false; | 
| +        if (trace_compiler) { | 
| +          THR_Print("--> FAIL: Class hierarchy has new subclasses."); | 
| +        } | 
| +      } | 
| + | 
| // Setting breakpoints at runtime could make a function non-optimizable. | 
| if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) { | 
| const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; | 
| @@ -632,14 +639,11 @@ NOT_IN_PRODUCT( | 
| } | 
|  | 
| if (code_was_installed) { | 
| -      // Register code with the classes it depends on because of CHA and | 
| -      // fields it depends on because of store guards, unless we cannot | 
| -      // deopt. | 
| -      for (intptr_t i = 0; | 
| -           i < thread()->cha()->leaf_classes().length(); | 
| -           ++i) { | 
| -        thread()->cha()->leaf_classes()[i]->RegisterCHACode(code); | 
| -      } | 
| +      // The generated code was compiled under certain assumptions about | 
| +      // class hierarchy and field types. Register these dependencies | 
| +      // to ensure that the code will be deoptimized if they are violated. | 
| +      thread()->cha()->RegisterDependencies(code); | 
| + | 
| const ZoneGrowableArray<const Field*>& guarded_fields = | 
| *flow_graph->parsed_function().guarded_fields(); | 
| for (intptr_t i = 0; i < guarded_fields.length(); i++) { | 
|  |