Revert "Version 3.0.58"

This reverts commit 60fee6c2df4137110817144c947691b764956353.

Reason for revert: Waiting to confirm it solves the issue.

Change-Id: I3662a5c57c249424b1ee2b6c5c9193848f6c73b4
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index fe54549..75df46f 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "3.0.58";
+  public static final String LABEL = "3.0.57";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
index 73cbb37..4fdd8f6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
@@ -273,7 +273,7 @@
             if (unboxedEnumsData.matchesValuesField(field)) {
               utilityMethods.computeIfAbsent(
                   valuesUtilityMethod, m -> synthesizeValuesUtilityMethod());
-              DexField fieldValues = null;
+              DexField fieldValues = createValuesField(holder);
               DexMethod methodValues = createValuesMethod(holder);
               utilityMethods.computeIfAbsent(
                   methodValues,
@@ -449,7 +449,7 @@
         new EnumUnboxingCfCodeProvider.EnumUnboxingValuesCfCodeProvider(
                 appView, method.holder, fieldValues, numEnumInstances, valuesUtilityMethod)
             .generateCfCode();
-    return synthesizeUtilityMethod(cfCode, method, false);
+    return synthesizeUtilityMethod(cfCode, method, true);
   }
 
   private DexMethod computeInstanceFieldUtilityMethod(DexType enumType, DexField field) {
@@ -628,7 +628,6 @@
   }
 
   private DexEncodedMethod synthesizeUtilityMethod(CfCode cfCode, DexMethod method, boolean sync) {
-    assert !sync;
     return new DexEncodedMethod(
         method,
         synthesizedMethodAccessFlags(sync),
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
index 70baaab..d21c6d9 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EnumUnboxingCfCodeProvider.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.code.CfConstNull;
 import com.android.tools.r8.cf.code.CfConstNumber;
 import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfFrame;
 import com.android.tools.r8.cf.code.CfFrame.FrameType;
 import com.android.tools.r8.cf.code.CfIf;
@@ -217,7 +218,7 @@
         int numEnumInstances,
         DexMethod initializationMethod) {
       super(appView, holder);
-      assert utilityField == null;
+      assert utilityField.type == appView.dexItemFactory().intArrayType;
       this.utilityField = utilityField;
       this.numEnumInstances = numEnumInstances;
       this.initializationMethod = initializationMethod;
@@ -232,14 +233,19 @@
       //      VALUES$com$x$MyEnum = EnumUnboxingMethods_values(2);
       //    }
       //    return VALUES$com$x$MyEnum;
-      // Due to b/191993388, this generates instead something like:
-      //  int[] UtilityClass#com$x$MyEnum_VALUES() {
-      //    return EnumUnboxingMethods_values(2);
-      //  }
       List<CfInstruction> instructions = new ArrayList<>();
+      CfLabel nullDest = new CfLabel();
+      instructions.add(new CfFieldInstruction(Opcodes.GETSTATIC, utilityField, utilityField));
+      instructions.add(new CfIf(If.Type.NE, ValueType.OBJECT, nullDest));
       instructions.add((new CfConstNumber(numEnumInstances, ValueType.INT)));
       assert initializationMethod.getArity() == 1;
       instructions.add(new CfInvoke(Opcodes.INVOKESTATIC, initializationMethod, false));
+      instructions.add(new CfFieldInstruction(Opcodes.PUTSTATIC, utilityField, utilityField));
+      instructions.add(nullDest);
+      instructions.add(
+          new CfFrame(
+              ImmutableInt2ReferenceSortedMap.<FrameType>builder().build(), ImmutableDeque.of()));
+      instructions.add(new CfFieldInstruction(Opcodes.GETSTATIC, utilityField, utilityField));
       instructions.add(new CfReturn(ValueType.OBJECT));
       return standardCfCodeFromInstructions(instructions);
     }