Add support for unresolved classes in optimizing.

Change-Id: I0e299a81e560eb9cb0737ec46125dffc99333b54
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 849f876..489f71d 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -4513,12 +4513,14 @@
              uint16_t type_index,
              const DexFile& dex_file,
              bool is_referrers_class,
-             uint32_t dex_pc)
+             uint32_t dex_pc,
+             bool needs_access_check)
       : HExpression(Primitive::kPrimNot, SideEffectsForArchRuntimeCalls(), dex_pc),
         type_index_(type_index),
         dex_file_(dex_file),
         is_referrers_class_(is_referrers_class),
         generate_clinit_check_(false),
+        needs_access_check_(needs_access_check),
         loaded_class_rti_(ReferenceTypeInfo::CreateInvalid()) {
     SetRawInputAt(0, current_method);
   }
@@ -4538,19 +4540,22 @@
   bool NeedsEnvironment() const OVERRIDE {
     // Will call runtime and load the class if the class is not loaded yet.
     // TODO: finer grain decision.
-    return !is_referrers_class_;
+    return !is_referrers_class_ || needs_access_check_;
   }
 
   bool MustGenerateClinitCheck() const {
     return generate_clinit_check_;
   }
-
   void SetMustGenerateClinitCheck(bool generate_clinit_check) {
     generate_clinit_check_ = generate_clinit_check;
   }
 
   bool CanCallRuntime() const {
-    return MustGenerateClinitCheck() || !is_referrers_class_;
+    return MustGenerateClinitCheck() || !is_referrers_class_ || needs_access_check_;
+  }
+
+  bool NeedsAccessCheck() const {
+    return needs_access_check_;
   }
 
   bool CanThrow() const OVERRIDE {
@@ -4586,6 +4591,7 @@
   // Whether this instruction must generate the initialization check.
   // Used for code generation.
   bool generate_clinit_check_;
+  bool needs_access_check_;
 
   ReferenceTypeInfo loaded_class_rti_;
 
@@ -4897,6 +4903,7 @@
  * or `HCheckCast`.
  */
 enum class TypeCheckKind {
+  kUnresolvedCheck,       // Check against an unresolved type.
   kExactCheck,            // Can do a single class compare.
   kClassHierarchyCheck,   // Can just walk the super class chain.
   kAbstractClassCheck,    // Can just walk the super class chain, starting one up.