Rewrite Objects.hash(Object...) to Arrays.hashCode(Object[])

Test: tools/test.py --no-internal -v *Backport*Test*
Change-Id: Idbe05bd785ae2442a4e08b869e39296bda512691
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 7b5344b..d3afa6c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -219,6 +219,7 @@
   public final DexString supplierDescriptor = createString("Ljava/util/function/Supplier;");
   public final DexString consumerDescriptor = createString("Ljava/util/function/Consumer;");
   public final DexString runnableDescriptor = createString("Ljava/lang/Runnable;");
+  public final DexString arraysDescriptor = createString("Ljava/util/Arrays;");
 
   public final DexString throwableDescriptor = createString(throwableDescriptorString);
   public final DexString illegalAccessErrorDescriptor =
@@ -561,7 +562,7 @@
     private JavaUtilArraysMethods() {
       asList =
           createMethod(
-              createString("Ljava/util/Arrays;"),
+              arraysDescriptor,
               createString("asList"),
               listDescriptor,
               new DexString[] {objectArrayDescriptor});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 84ca11d..c424e06 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -343,7 +343,7 @@
       name = factory.createString("hash");
       proto = factory.createProto(factory.intType, factory.objectArrayType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, ObjectsMethods::new));
+      addProvider(new InvokeRewriter(method, ObjectsMethods::rewriteToArraysHashCode));
 
       // int Objects.hashCode(Object o)
       name = factory.createString("hashCode");
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
index 6ac64e9..a4ea1b5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
@@ -6,8 +6,10 @@
 
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
 import com.android.tools.r8.utils.InternalOptions;
@@ -62,8 +64,14 @@
     return a == b || (a != null && a.equals(b));
   }
 
-  public static int hash(Object[] o) {
-    return Arrays.hashCode(o);
+  public static void rewriteToArraysHashCode(InvokeMethod invoke, InstructionListIterator iterator,
+      DexItemFactory factory) {
+    DexType arraysType = factory.createType(factory.arraysDescriptor);
+    DexMethod hashCodeMethod =
+        factory.createMethod(arraysType, invoke.getInvokedMethod().proto, "hashCode");
+    InvokeStatic arraysHashCode =
+        new InvokeStatic(hashCodeMethod, invoke.outValue(), invoke.inValues(), false);
+    iterator.replaceCurrentInstruction(arraysHashCode);
   }
 
   public static int hashCode(Object o) {