Unresolved types aren't assignable from Object.

Also, don't eliminate check-cast if an access check is required.

Change-Id: Ibb864e01917a93f77db4cf6eb53461c5c7cb0162
diff --git a/src/compiler/dex/quick/gen_common.cc b/src/compiler/dex/quick/gen_common.cc
index 12bdddd..055b67c 100644
--- a/src/compiler/dex/quick/gen_common.cc
+++ b/src/compiler/dex/quick/gen_common.cc
@@ -973,8 +973,10 @@
   const CompilerDriver::MethodReference mr(
         cu->GetDexFile(),
         cu->GetDexMethodIndex());
-
-  if (cu_->compiler_driver->IsSafeCast(mr, insn_idx)) {
+  bool needs_access_check = !cu_->compiler_driver->CanAccessTypeWithoutChecks(cu_->method_idx,
+                                                                              *cu_->dex_file,
+                                                                              type_idx);
+  if (!needs_access_check && cu_->compiler_driver->IsSafeCast(mr, insn_idx)) {
     // Verifier type analysis proved this check cast would never cause an exception.
     return;
   }
@@ -983,9 +985,7 @@
   LockCallTemps();
   LoadCurrMethodDirect(TargetReg(kArg1));  // kArg1 <= current Method*
   int class_reg = TargetReg(kArg2);  // kArg2 will hold the Class*
-  if (!cu_->compiler_driver->CanAccessTypeWithoutChecks(cu_->method_idx,
-                                                   *cu_->dex_file,
-                                                   type_idx)) {
+  if (needs_access_check) {
     // Check we have access to type_idx and if not throw IllegalAccessError,
     // returns Class* in kRet0
     // InitializeTypeAndVerifyAccess(idx, method)
diff --git a/src/verifier/method_verifier.cc b/src/verifier/method_verifier.cc
index 9d4b902..2798ab3 100644
--- a/src/verifier/method_verifier.cc
+++ b/src/verifier/method_verifier.cc
@@ -3325,7 +3325,6 @@
       mscs->insert(dex_pc);
     }
   }
-
   return mscs.release();
 }
 
diff --git a/src/verifier/reg_type.cc b/src/verifier/reg_type.cc
index 55ebcdb..8111db6 100644
--- a/src/verifier/reg_type.cc
+++ b/src/verifier/reg_type.cc
@@ -747,8 +747,8 @@
         // We're assignable from the Class point-of-view
         return true;
       } else if (IsUnresolvedTypes()) {
-        // Unresolved types are only assignable for null, Object and equality.
-        return (src.IsZero() || src.IsJavaLangObject());
+        // Unresolved types are only assignable for null and equality.
+        return src.IsZero();
       } else {
         return false;
       }