Correctly synthesize references

Bug: b/378780054
Change-Id: Id5db5d28c0e507ac9f4cd3a42f55a5ebb65bb677
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
index 3743f0c..2084f67 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
@@ -42,45 +42,9 @@
 public final class RecordCfMethods {
 
   public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
-    factory.createSynthesizedType("Ljava/util/Arrays;");
     factory.createSynthesizedType("[Ljava/lang/Object;");
     factory.createSynthesizedType("[Ljava/lang/String;");
   }
-
-  public static CfCode RecordMethods_hashCode(DexItemFactory factory, DexMethod method) {
-    CfLabel label0 = new CfLabel();
-    CfLabel label1 = new CfLabel();
-    return new CfCode(
-        method.holder,
-        2,
-        2,
-        ImmutableList.of(
-            label0,
-            new CfConstNumber(31, ValueType.INT),
-            new CfLoad(ValueType.OBJECT, 1),
-            new CfInvoke(
-                184,
-                factory.createMethod(
-                    factory.createType("Ljava/util/Arrays;"),
-                    factory.createProto(factory.intType, factory.createType("[Ljava/lang/Object;")),
-                    factory.createString("hashCode")),
-                false),
-            new CfArithmeticBinop(CfArithmeticBinop.Opcode.Mul, NumericType.INT),
-            new CfLoad(ValueType.OBJECT, 0),
-            new CfInvoke(
-                182,
-                factory.createMethod(
-                    factory.objectType,
-                    factory.createProto(factory.intType),
-                    factory.createString("hashCode")),
-                false),
-            new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
-            new CfReturn(ValueType.INT),
-            label1),
-        ImmutableList.of(),
-        ImmutableList.of());
-  }
-
   public static CfCode RecordMethods_toString(DexItemFactory factory, DexMethod method) {
     CfLabel label0 = new CfLabel();
     CfLabel label1 = new CfLabel();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
index f484a69..aae2fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
@@ -45,7 +45,6 @@
 import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer.RecordInstructionDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.records.RecordRewriterHelper.RecordInvokeDynamic;
 import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqCfCodeProvider;
-import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqualsCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordGetFieldsAsObjectsCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordHashCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
@@ -103,8 +102,8 @@
   public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
     RecordCfMethods.registerSynthesizedCodeReferences(factory);
     RecordGetFieldsAsObjectsCfCodeProvider.registerSynthesizedCodeReferences(factory);
-    RecordEqualsCfCodeProvider.registerSynthesizedCodeReferences(factory);
-    factory.createSynthesizedType("Ljava/lang/Objects;");
+    RecordEqCfCodeProvider.registerSynthesizedCodeReferences(factory);
+    RecordHashCfCodeProvider.registerSynthesizedCodeReferences(factory);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
index 8ba50fe..c4bb758 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
@@ -293,75 +293,4 @@
       }
     }
   }
-
-  public static class RecordEqualsCfCodeProvider extends SyntheticCfCodeProvider {
-
-    private final DexMethod getFieldsAsObjects;
-
-    public RecordEqualsCfCodeProvider(
-        AppView<?> appView, DexType holder, DexMethod getFieldsAsObjects) {
-      super(appView, holder);
-      this.getFieldsAsObjects = getFieldsAsObjects;
-    }
-
-    public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
-      factory.createSynthesizedType("[Ljava/lang/Object;");
-      factory.createSynthesizedType("[Ljava/util/Arrays;");
-    }
-
-    @Override
-    public CfCode generateCfCode() {
-      // This generates something along the lines of:
-      // if (other == null) {
-      //   return false;
-      // }
-      // if (this.getClass() != other.getClass()) {
-      //     return false;
-      // }
-      // return Arrays.equals(
-      //     recordInstance.getFieldsAsObjects(),
-      //     ((RecordClass) other).getFieldsAsObjects());
-      DexItemFactory factory = appView.dexItemFactory();
-      int numberOfInstructions = 22;
-      List<CfInstruction> instructions = new ArrayList<>(numberOfInstructions);
-      CfLabel notNullLabel = new CfLabel();
-      CfLabel fieldCmp = new CfLabel();
-      ValueType recordType = ValueType.fromDexType(getHolder());
-      ValueType objectType = ValueType.fromDexType(factory.objectType);
-      instructions.add(new CfLoad(objectType, 1));
-      instructions.add(new CfIf(IfType.NE, ValueType.OBJECT, notNullLabel));
-      instructions.add(new CfConstNumber(0, ValueType.INT));
-      instructions.add(new CfReturn(ValueType.INT));
-      instructions.add(notNullLabel);
-      instructions.add(
-          CfFrame.builder()
-              .appendLocal(FrameType.initialized(getHolder()))
-              .appendLocal(FrameType.initialized(appView.dexItemFactory().objectType))
-              .build());
-      instructions.add(new CfLoad(recordType, 0));
-      instructions.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.objectMembers.getClass, false));
-      instructions.add(new CfLoad(objectType, 1));
-      instructions.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.objectMembers.getClass, false));
-      instructions.add(new CfIfCmp(IfType.EQ, ValueType.OBJECT, fieldCmp));
-      instructions.add(new CfConstNumber(0, ValueType.INT));
-      instructions.add(new CfReturn(ValueType.INT));
-      instructions.add(fieldCmp);
-      instructions.add(
-          CfFrame.builder()
-              .appendLocal(FrameType.initialized(getHolder()))
-              .appendLocal(FrameType.initialized(appView.dexItemFactory().objectType))
-              .build());
-      instructions.add(new CfLoad(recordType, 0));
-      instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
-      instructions.add(new CfLoad(objectType, 1));
-      instructions.add(new CfCheckCast(getHolder(), true));
-      instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
-      instructions.add(
-          new CfInvoke(
-              Opcodes.INVOKESTATIC, factory.javaUtilArraysMethods.equalsObjectArray, false));
-      instructions.add(new CfReturn(ValueType.INT));
-      assert instructions.size() == numberOfInstructions;
-      return standardCfCodeFromInstructions(instructions);
-    }
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
index f00657c..5ec2331 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.desugar.records;
 
-import java.util.Arrays;
-
 // This class implements support methods for record desugaring. The RecordRewriter
 // rewrites relevant calls to one of the following methods.
 public class RecordMethods {
@@ -25,8 +23,4 @@
     builder.append("]");
     return builder.toString();
   }
-
-  public static int hashCode(Class<?> recordClass, Object[] recordFieldsAsObjects) {
-    return 31 * Arrays.hashCode(recordFieldsAsObjects) + recordClass.hashCode();
-  }
 }