Version 3.0.58

Disable synchronization on enum unboxing for values

Bug: 191993388
Change-Id: I0e1bb9ebf8cb22605ef05ef4da44106c77b33526
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 75df46f..fe54549 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.57";
+  public static final String LABEL = "3.0.58";
 
   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 4fdd8f6..73cbb37 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 = createValuesField(holder);
+              DexField fieldValues = null;
               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, true);
+    return synthesizeUtilityMethod(cfCode, method, false);
   }
 
   private DexMethod computeInstanceFieldUtilityMethod(DexType enumType, DexField field) {
@@ -628,6 +628,7 @@
   }
 
   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 d21c6d9..70baaab 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,7 +7,6 @@
 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;
@@ -218,7 +217,7 @@
         int numEnumInstances,
         DexMethod initializationMethod) {
       super(appView, holder);
-      assert utilityField.type == appView.dexItemFactory().intArrayType;
+      assert utilityField == null;
       this.utilityField = utilityField;
       this.numEnumInstances = numEnumInstances;
       this.initializationMethod = initializationMethod;
@@ -233,19 +232,14 @@
       //      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);
     }