Optimizing: Improve generated code for HLoadClass...

... for resolved package-private class accessed from
unresolved compiling class in the same package.

Test: Additional tests in 727-checker-unresolved-class.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 161898207
Change-Id: I215dcd9db2297f5c8d9547635d80975d88534579
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index 1aef100..2da19ba 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -2419,9 +2419,11 @@
     return true;
   } else if (klass->IsPublic()) {
     return false;
+  } else if (dex_compilation_unit_->GetCompilingClass() != nullptr) {
+    return !dex_compilation_unit_->GetCompilingClass()->CanAccess(klass);
   } else {
-    ObjPtr<mirror::Class> compiling_class = dex_compilation_unit_->GetCompilingClass().Get();
-    return compiling_class == nullptr || !compiling_class->CanAccess(klass);
+    SamePackageCompare same_package(*dex_compilation_unit_);
+    return !same_package(klass);
   }
 }
 
diff --git a/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
index 8469cf7..423fdd3 100644
--- a/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
+++ b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
@@ -23,6 +23,9 @@
 // loader is illegal even though the package name is the same.
 public class SubclassOfUnresolvedClass2 extends UnresolvedClass {
   public static void $noinline$main() {
+    $noinline$testResolvedPublicClass();
+    $noinline$testResolvedPackagePrivateClass();
+
     $noinline$testPublicFieldInResolvedPackagePrivateClass();
     $noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
     $noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -40,6 +43,21 @@
     System.out.println("SubclassOfUnresolvedClass2 passed");
   }
 
+  /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testResolvedPublicClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+  static void $noinline$testResolvedPublicClass() {
+    Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+  }
+
+  /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testResolvedPackagePrivateClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:true
+  static void $noinline$testResolvedPackagePrivateClass() {
+    try {
+      Class<?> c = ResolvedPackagePrivateClass.class;
+      throw new Error("Unreachable");
+    } catch (IllegalAccessError expected) {}
+  }
+
   /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
   /// CHECK: UnresolvedStaticFieldSet
 
diff --git a/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java b/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
index d767411..56a4f6a 100644
--- a/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
+++ b/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
@@ -20,6 +20,9 @@
 
 public class SubclassOfUnresolvedClass extends UnresolvedClass {
   public static void $noinline$main() {
+    $noinline$testResolvedPublicClass();
+    $noinline$testResolvedPackagePrivateClass();
+
     $noinline$testPublicFieldInResolvedPackagePrivateClass();
     $noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
     $noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -37,6 +40,18 @@
     System.out.println("SubclassOfUnresolvedClass passed");
   }
 
+  /// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testResolvedPublicClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+  static void $noinline$testResolvedPublicClass() {
+    Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+  }
+
+  /// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testResolvedPackagePrivateClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:false
+  static void $noinline$testResolvedPackagePrivateClass() {
+    Class<?> c = ResolvedPackagePrivateClass.class;
+  }
+
   /// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
   /// CHECK: StaticFieldSet
 
diff --git a/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java b/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
index eaa9493..336c555 100644
--- a/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
+++ b/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
@@ -21,6 +21,9 @@
 
 public class UnresolvedClass {
   public static void $noinline$main() {
+    $noinline$testResolvedPublicClass();
+    $noinline$testResolvedPackagePrivateClass();
+
     $noinline$testPublicFieldInResolvedPackagePrivateClass();
     $noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
     $noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -38,6 +41,21 @@
     System.out.println("UnresolvedClass passed");
   }
 
+  /// CHECK-START: void unresolved.UnresolvedClass.$noinline$testResolvedPublicClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+  static void $noinline$testResolvedPublicClass() {
+    Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+  }
+
+  /// CHECK-START: void unresolved.UnresolvedClass.$noinline$testResolvedPackagePrivateClass() builder (after)
+  /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:true
+  static void $noinline$testResolvedPackagePrivateClass() {
+    try {
+      Class<?> c = ResolvedPackagePrivateClass.class;
+      throw new Error("Unreachable");
+    } catch (IllegalAccessError expected) {}
+  }
+
   /// CHECK-START: void unresolved.UnresolvedClass.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
   /// CHECK: UnresolvedStaticFieldSet