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