Check instantiability at runtime when inconclusive at compile time

Change-Id: I40e4a3da05936fee77e074d5dc4d0fec1a1c5526
diff --git a/src/compiler.h b/src/compiler.h
index 4822b9f..1165161 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -107,6 +107,21 @@
     return referrer_class->CanAccess(resolved_class);
   }
 
+  bool CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx, const DexCache* dex_cache,
+                                              const DexFile& dex_file, uint32_t type_idx) const {
+    Class* resolved_class = dex_cache->GetResolvedType(type_idx);
+    if (resolved_class == NULL) {
+      return false;  // Unknown class needs access checks.
+    }
+    const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx);
+    Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
+    if (referrer_class == NULL) {
+      return false;  // Incomplete referrer knowledge needs access check.
+    }
+    // Perform access check, will return true if access is ok or false if we're going to have to
+    // check this at runtime (for example for class loaders).
+    return referrer_class->CanAccess(resolved_class) && resolved_class->IsInstantiable();
+  }
  private:
 
   // Checks if class specified by type_idx is one of the image_classes_