Revert "Version 2.1.49"
This reverts commit b0c69954e65e2005002a48179dc56b5e2b4b7011.
Reason for revert: Broken test introduced
Change-Id: I401dc3fc72827735e6dcb74c5d855f9b57d871fd
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 59db0a2..5f5162a 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.1.49";
+ public static final String LABEL = "2.1.48";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 059c49b..5dc7874 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -24,7 +24,6 @@
import com.android.tools.r8.graph.FieldResolutionResult;
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.GraphLense.NestedGraphLense;
-import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
import com.android.tools.r8.graph.RewrittenPrototypeDescription.RewrittenTypeInfo;
@@ -161,7 +160,7 @@
analyzeCheckCast(instruction.asCheckCast(), eligibleEnums);
break;
case Opcodes.INVOKE_STATIC:
- analyzeInvokeStatic(instruction.asInvokeStatic(), eligibleEnums, code.context());
+ analyzeInvokeStatic(instruction.asInvokeStatic(), eligibleEnums);
break;
case Opcodes.STATIC_GET:
case Opcodes.INSTANCE_GET:
@@ -209,17 +208,11 @@
}
}
- private void analyzeInvokeStatic(
- InvokeStatic invokeStatic, Set<DexType> eligibleEnums, ProgramMethod context) {
+ private void analyzeInvokeStatic(InvokeStatic invokeStatic, Set<DexType> eligibleEnums) {
DexMethod invokedMethod = invokeStatic.getInvokedMethod();
DexProgramClass enumClass = getEnumUnboxingCandidateOrNull(invokedMethod.holder);
if (enumClass != null) {
- DexEncodedMethod method = invokeStatic.lookupSingleTarget(appView, context);
- if (method != null) {
- eligibleEnums.add(enumClass.type);
- } else {
- markEnumAsUnboxable(Reason.INVALID_INVOKE, enumClass);
- }
+ eligibleEnums.add(enumClass.type);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
index f9dcdf6..bac8a81 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
@@ -75,12 +75,6 @@
boolean isOrdinalInvoke = invokedMethod == factory.enumMethods.ordinal;
boolean isNameInvoke = invokedMethod == factory.enumMethods.name;
boolean isToStringInvoke = invokedMethod == factory.enumMethods.toString;
-
- // TODO(b/160667929): Re-enable name()/toString() optimizations.
- if (!isOrdinalInvoke) {
- continue;
- }
-
if (!isOrdinalInvoke && !isNameInvoke && !isToStringInvoke) {
continue;
}
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index b9020eb..b262e4e 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -154,7 +154,7 @@
return addKeepMainRule(mainClass.getTypeName());
}
- public T addKeepMainRules(Class<?>... mainClasses) {
+ public T addKeepMainRules(Class<?>[] mainClasses) {
for (Class<?> mainClass : mainClasses) {
this.addKeepMainRule(mainClass);
}
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java
deleted file mode 100644
index 83393bf..0000000
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumToStringLibTest.java
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.enumunboxing;
-
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.StringContains.containsString;
-
-import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.util.List;
-import org.junit.Assume;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class EnumToStringLibTest extends EnumUnboxingTestBase {
-
- private final TestParameters parameters;
- private final boolean enumValueOptimization;
- private final EnumKeepRules enumKeepRules;
- private final boolean enumUnboxing;
-
- @Parameterized.Parameters(name = "{0} valueOpt: {1} keep: {2} unbox: {3}")
- public static List<Object[]> data() {
- return buildParameters(
- getTestParameters().withDexRuntimes().withAllApiLevels().build(),
- BooleanUtils.values(),
- getAllEnumKeepRules(),
- BooleanUtils.values());
- }
-
- public EnumToStringLibTest(
- TestParameters parameters,
- boolean enumValueOptimization,
- EnumKeepRules enumKeepRules,
- boolean enumUnboxing) {
- this.parameters = parameters;
- this.enumValueOptimization = enumValueOptimization;
- this.enumKeepRules = enumKeepRules;
- this.enumUnboxing = enumUnboxing;
- }
-
- @Test
- public void testToStringLib() throws Exception {
- Assume.assumeFalse(
- "The test rely on valueOf, so only studio or snap keep rules are valid.",
- enumKeepRules == EnumKeepRules.NONE);
- // Compile the lib cf to cf.
- R8TestCompileResult javaLibShrunk = compileLibrary();
- assertEnumFieldsMinified(javaLibShrunk.inspector());
- // Compile the program with the lib.
- R8TestCompileResult compile =
- testForR8(parameters.getBackend())
- .addProgramClasses(AlwaysCorrectProgram.class, AlwaysCorrectProgram2.class)
- .addProgramFiles(javaLibShrunk.writeToZip())
- .addKeepMainRule(AlwaysCorrectProgram.class)
- .addKeepMainRule(AlwaysCorrectProgram2.class)
- .addKeepRules(enumKeepRules.getKeepRules())
- .addOptionsModification(
- options -> {
- options.enableEnumUnboxing = enumUnboxing;
- options.enableEnumValueOptimization = enumValueOptimization;
- options.enableEnumSwitchMapRemoval = enumValueOptimization;
- options.testing.enableEnumUnboxingDebugLogs = enumUnboxing;
- })
- .allowDiagnosticInfoMessages(enumUnboxing)
- .setMinApi(parameters.getApiLevel())
- .compile();
- compile
- .run(parameters.getRuntime(), AlwaysCorrectProgram.class)
- .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2", "0", "1", "2");
- if (!enumKeepRules.isSnap() && enumUnboxing) {
- // TODO(b/160667929): Fix toString and enum unboxing.
- compile
- .run(parameters.getRuntime(), AlwaysCorrectProgram2.class)
- .assertFailureWithErrorThatMatches(containsString("IllegalArgumentException"));
- return;
- }
- compile
- .run(parameters.getRuntime(), AlwaysCorrectProgram2.class)
- .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2");
- }
-
- private void assertEnumFieldsMinified(CodeInspector codeInspector) throws Exception {
- if (enumKeepRules.isSnap()) {
- return;
- }
- ClassSubject clazz = codeInspector.clazz(ToStringLib.LibEnum.class);
- assertThat(clazz, isPresent());
- for (String fieldName : new String[] {"COFFEE", "BEAN", "SUGAR"}) {
- assertThat(
- codeInspector.field(ToStringLib.LibEnum.class.getField(fieldName)),
- isPresentAndRenamed());
- }
- }
-
- private R8TestCompileResult compileLibrary() throws Exception {
- return testForR8(Backend.CF)
- .addProgramClasses(ToStringLib.class, ToStringLib.LibEnum.class)
- .addKeepRules(enumKeepRules.getKeepRules())
- // TODO(b/160535629): Work-around on some optimizations relying on $VALUES name.
- .addKeepRules(
- "-keep enum "
- + ToStringLib.LibEnum.class.getName()
- + " { static "
- + ToStringLib.LibEnum.class.getName()
- + "[] $VALUES; }")
- .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
- .addKeepMethodRules(
- Reference.methodFromMethod(
- ToStringLib.class.getDeclaredMethod("lookupByName", String.class)),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("getCoffee")),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("getBean")),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("getSugar")),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("directCoffee")),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("directBean")),
- Reference.methodFromMethod(ToStringLib.class.getDeclaredMethod("directSugar")))
- .addKeepClassRules(ToStringLib.LibEnum.class)
- .allowDiagnosticMessages()
- .setMinApi(parameters.getApiLevel())
- .compile()
- .inspectDiagnosticMessages(
- msg ->
- assertEnumIsBoxed(
- ToStringLib.LibEnum.class, ToStringLib.LibEnum.class.getSimpleName(), msg));
- }
-
- // This class emulates a library with the three public methods getEnumXXX.
- public static class ToStringLib {
-
- // We pick names here that we assume won't be picked by the minifier (i.e., not a,b,c).
- public enum LibEnum {
- COFFEE,
- BEAN,
- SUGAR;
- }
-
- // If there is a keep rule on LibEnum fields, then ToStringLib.lookupByName("COFFEE")
- // should answer 0, else, the behavior of ToStringLib.lookupByName("COFFEE") is undefined.
- // ToStringLib.lookupByName(LibEnum.COFFEE.toString()) should always answer 0, no matter
- // what keep rules are on LibEnum.
- public static int lookupByName(String key) {
- if (key == null) {
- return -1;
- } else if (key.contains(LibEnum.COFFEE.name())) {
- return LibEnum.COFFEE.ordinal();
- } else if (key.contains(LibEnum.BEAN.name())) {
- return LibEnum.BEAN.ordinal();
- } else if (key.contains(LibEnum.SUGAR.name())) {
- return LibEnum.SUGAR.ordinal();
- } else {
- return -2;
- }
- }
-
- // The following method should always return 0, no matter what keep rules are on LibEnum.
- public static int directCoffee() {
- return LibEnum.valueOf(LibEnum.COFFEE.toString()).ordinal();
- }
-
- public static int directBean() {
- return LibEnum.valueOf(LibEnum.BEAN.toString()).ordinal();
- }
-
- public static int directSugar() {
- return LibEnum.valueOf(LibEnum.SUGAR.toString()).ordinal();
- }
-
- public static LibEnum getCoffee() {
- return LibEnum.COFFEE;
- }
-
- public static LibEnum getBean() {
- return LibEnum.BEAN;
- }
-
- public static LibEnum getSugar() {
- return LibEnum.SUGAR;
- }
- }
-
- // The next two classes emulate a program using the ToStringLib library.
- public static class AlwaysCorrectProgram {
-
- public static void main(String[] args) {
- System.out.println(ToStringLib.directCoffee());
- System.out.println(ToStringLib.directBean());
- System.out.println(ToStringLib.directSugar());
- System.out.println(ToStringLib.lookupByName(ToStringLib.getCoffee().toString()));
- System.out.println(ToStringLib.lookupByName(ToStringLib.getBean().toString()));
- System.out.println(ToStringLib.lookupByName(ToStringLib.getSugar().toString()));
- System.out.println(ToStringLib.LibEnum.valueOf(ToStringLib.getCoffee().toString()).ordinal());
- System.out.println(ToStringLib.LibEnum.valueOf(ToStringLib.getBean().toString()).ordinal());
- System.out.println(ToStringLib.LibEnum.valueOf(ToStringLib.getSugar().toString()).ordinal());
- }
- }
-
- public static class AlwaysCorrectProgram2 {
-
- public static void main(String[] args) {
- System.out.println(ToStringLib.lookupByName("COFFEE"));
- System.out.println(ToStringLib.lookupByName("BEAN"));
- System.out.println(ToStringLib.lookupByName("SUGAR"));
- System.out.println(ToStringLib.LibEnum.valueOf("COFFEE").ordinal());
- System.out.println(ToStringLib.LibEnum.valueOf("BEAN").ordinal());
- System.out.println(ToStringLib.LibEnum.valueOf("SUGAR").ordinal());
- }
- }
-}
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingB160535628Test.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingB160535628Test.java
deleted file mode 100644
index 5ccd903..0000000
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingB160535628Test.java
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.enumunboxing;
-
-import static org.hamcrest.core.StringContains.containsString;
-
-import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestDiagnosticMessages;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.BooleanUtils;
-import java.nio.file.Path;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class EnumUnboxingB160535628Test extends EnumUnboxingTestBase {
-
- private final TestParameters parameters;
- private final boolean missingStaticMethods;
-
- @Parameterized.Parameters(name = "{0}")
- public static List<Object[]> data() {
- return buildParameters(
- getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values());
- }
-
- public EnumUnboxingB160535628Test(TestParameters parameters, boolean missingStaticMethods) {
- this.parameters = parameters;
- this.missingStaticMethods = missingStaticMethods;
- }
-
- @Test
- public void testCallToMissingStaticMethodInUnboxedEnum() throws Exception {
- // Compile the lib cf to cf.
- Path javaLibShrunk = compileLibrary();
- // Compile the program with the lib.
- // This should compile without error into code raising the correct NoSuchMethod errors.
- R8TestCompileResult compile =
- testForR8(parameters.getBackend())
- .addProgramClasses(ProgramValueOf.class, ProgramStaticMethod.class)
- .addProgramFiles(javaLibShrunk)
- .addKeepMainRules(ProgramValueOf.class, ProgramStaticMethod.class)
- .addOptionsModification(
- options -> {
- options.enableEnumUnboxing = true;
- options.testing.enableEnumUnboxingDebugLogs = true;
- })
- .allowDiagnosticMessages()
- .setMinApi(parameters.getApiLevel())
- .compile()
- .inspectDiagnosticMessages(
- // The enums cannot be unboxed if static methods are missing,
- // but they should be unboxed otherwise.
- this::assertEnumUnboxedIfStaticMethodsPresent);
- if (missingStaticMethods) {
- compile
- .run(parameters.getRuntime(), ProgramValueOf.class)
- .assertFailureWithErrorThatMatches(containsString("NoSuchMethodError"))
- .assertFailureWithErrorThatMatches(containsString("valueOf"));
- compile
- .run(parameters.getRuntime(), ProgramStaticMethod.class)
- .assertFailureWithErrorThatMatches(containsString("NoSuchMethodError"))
- .assertFailureWithErrorThatMatches(containsString("staticMethod"));
- } else {
- compile.run(parameters.getRuntime(), ProgramValueOf.class).assertSuccessWithOutputLines("0");
- compile
- .run(parameters.getRuntime(), ProgramStaticMethod.class)
- .assertSuccessWithOutputLines("42");
- }
- }
-
- private Path compileLibrary() throws Exception {
- return testForR8(Backend.CF)
- .addProgramClasses(Lib.class, Lib.LibEnumStaticMethod.class, Lib.LibEnum.class)
- .addKeepRules("-keep enum * { <fields>; }")
- .addKeepRules(missingStaticMethods ? "" : "-keep enum * { static <methods>; }")
- .addOptionsModification(
- options -> {
- options.enableEnumUnboxing = true;
- options.testing.enableEnumUnboxingDebugLogs = true;
- })
- .addKeepClassRules(Lib.LibEnumStaticMethod.class)
- .allowDiagnosticMessages()
- .setMinApi(parameters.getApiLevel())
- .compile()
- .inspectDiagnosticMessages(
- msg -> {
- assertEnumIsBoxed(
- Lib.LibEnumStaticMethod.class,
- Lib.LibEnumStaticMethod.class.getSimpleName(),
- msg);
- assertEnumIsBoxed(Lib.LibEnum.class, Lib.LibEnum.class.getSimpleName(), msg);
- })
- .writeToZip();
- }
-
- private void assertEnumUnboxedIfStaticMethodsPresent(TestDiagnosticMessages msg) {
- if (missingStaticMethods) {
- assertEnumIsBoxed(
- Lib.LibEnumStaticMethod.class, Lib.LibEnumStaticMethod.class.getSimpleName(), msg);
- assertEnumIsBoxed(Lib.LibEnum.class, Lib.LibEnum.class.getSimpleName(), msg);
- } else {
- assertEnumIsUnboxed(
- Lib.LibEnumStaticMethod.class, Lib.LibEnumStaticMethod.class.getSimpleName(), msg);
- assertEnumIsUnboxed(Lib.LibEnum.class, Lib.LibEnum.class.getSimpleName(), msg);
- }
- }
-
- public static class Lib {
-
- public enum LibEnumStaticMethod {
- A,
- B;
-
- static int staticMethod() {
- return 42;
- }
- }
-
- public enum LibEnum {
- A,
- B
- }
- }
-
- public static class ProgramValueOf {
-
- public static void main(String[] args) {
- System.out.println(Lib.LibEnumStaticMethod.valueOf(Lib.LibEnum.A.name()).ordinal());
- }
- }
-
- public static class ProgramStaticMethod {
-
- public static void main(String[] args) {
- System.out.println(Lib.LibEnumStaticMethod.staticMethod());
- }
- }
-}
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
index 1bf5f83..ae4947a 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -20,7 +20,6 @@
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import java.util.List;
import java.util.Objects;
-import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -75,14 +74,13 @@
if (enableOptimization) {
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("simple"), 1);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("local"), 1);
- // TODO(b/160667929): Re-enable name()/toString() optimizations.
// String concatenation optimization is enabled for DEX output.
// Even replaced ordinal is concatenated (and gone).
- // if (parameters.isDexRuntime()) {
- // assertOrdinalReplacedAndGone(clazz.uniqueMethodWithName("multipleUsages"));
- // } else {
- assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), 1);
- // }
+ if (parameters.isDexRuntime()) {
+ assertOrdinalReplacedAndGone(clazz.uniqueMethodWithName("multipleUsages"));
+ } else {
+ assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), 1);
+ }
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inlined"), 1);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inSwitch"), 11);
assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("differentTypeStaticField"), 1);
@@ -123,7 +121,6 @@
assertTrue(clazz.isPresent());
if (enableOptimization) {
- Assume.assumeTrue("TODO(b/160667929): Re-enable name()/toString() optimizations.", false);
assertNameReplacedWithConst(clazz.uniqueMethodWithName("simple"), "TWO");
assertNameReplacedWithConst(clazz.uniqueMethodWithName("local"), "TWO");
// String concatenation optimization is enabled for DEX output.
@@ -174,7 +171,6 @@
assertToStringWasNotReplaced(clazz.uniqueMethodWithName("valueWithoutToString"));
if (enableOptimization) {
- Assume.assumeTrue("TODO(b/160667929): Re-enable name()/toString() optimizations.", false);
assertToStringReplacedWithConst(clazz.uniqueMethodWithName("noToString"), "TWO");
assertToStringReplacedWithConst(clazz.uniqueMethodWithName("local"), "TWO");
assertToStringReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), "TWO");