Version 2.2.78

Disable synchronization on enum unboxing for values

Bug: 191993388
Change-Id: I723b8b085affdcb22b1ca8877fc496620575457e
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 214c5fa..45c054b 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 = "2.2.77";
+  public static final String LABEL = "2.2.78";
 
   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 1bca720..37ef730 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
@@ -292,8 +292,7 @@
             if (enumValueInfo == null && staticGet.getField().name == factory.enumValuesFieldName) {
               utilityMethods.computeIfAbsent(
                   valuesUtilityMethod, m -> synthesizeValuesUtilityMethod());
-              DexField fieldValues = createValuesField(holder);
-              utilityFields.computeIfAbsent(fieldValues, this::computeValuesEncodedField);
+              DexField fieldValues = null;
               DexMethod methodValues = createValuesMethod(holder);
               utilityMethods.computeIfAbsent(
                   methodValues,
@@ -470,7 +469,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) {
@@ -660,6 +659,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 75358f7..c976dbb 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;
@@ -229,7 +228,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;
@@ -244,19 +243,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);
     }