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);
}