Backport: Don't do any switch rewriting for cf to cf desugaring

CL: https://r8-review.googlesource.com/c/r8/+/57140/

Bug: 177211225
Change-Id: Ic468172d59eadec69986e0c36b4b3aa94bb900f4
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index ceae49c..dd44634 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -382,6 +382,11 @@
     internal.programConsumer = getProgramConsumer();
     if (internal.programConsumer instanceof ClassFileConsumer) {
       internal.cfToCfDesugar = true;
+      // Turn off switch optimizations when desugaring to class file format.
+      assert internal.enableSwitchRewriting;
+      internal.enableSwitchRewriting = false;
+      assert internal.enableStringSwitchConversion;
+      internal.enableStringSwitchConversion = false;
     }
     internal.mainDexListConsumer = getMainDexListConsumer();
     internal.minimalMainDex = internal.debug || minimalMainDex;
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 4b35d17..f9f2ba6 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -93,9 +93,19 @@
       ExceptionUtils.withD8CompilationHandler(
           options.reporter,
           () -> {
+            // Desugar to class file format and turn off switch optimizations, as the final
+            // compilation with D8 or R8 will do that.
             options.cfToCfDesugar = true;
+            assert options.enableSwitchRewriting;
+            options.enableSwitchRewriting = false;
+            assert options.enableStringSwitchConversion;
+            options.enableStringSwitchConversion = false;
+
             desugar(app, options, executorService);
+
             options.cfToCfDesugar = false;
+            options.enableSwitchRewriting = true;
+            options.enableStringSwitchConversion = true;
           });
       assert !options.cfToCfDesugar;
       if (shrink) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 172a6b3..af13244 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -965,7 +965,10 @@
     return rewriteSwitch(code, SwitchCaseAnalyzer.getInstance());
   }
 
-  public boolean rewriteSwitch(IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) {
+  private boolean rewriteSwitch(IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) {
+    if (!options.isSwitchRewritingEnabled()) {
+      return false;
+    }
     if (!code.metadata().mayHaveSwitch()) {
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index af62b23..85c03d0 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -265,6 +265,7 @@
   // the actual catch handler allowed when inlining. Threshold found empirically by testing on
   // GMS Core.
   public int inliningControlFlowResolutionBlocksThreshold = 15;
+  public boolean enableSwitchRewriting = true;
   public boolean enableStringSwitchConversion = true;
   public int minimumStringSwitchSize = 3;
   public boolean enableEnumValueOptimization = true;
@@ -1334,6 +1335,10 @@
         && (!canUseDefaultAndStaticInterfaceMethods() || cfToCfDesugar);
   }
 
+  public boolean isSwitchRewritingEnabled() {
+    return enableSwitchRewriting && !debug;
+  }
+
   public boolean isStringSwitchConversionEnabled() {
     return enableStringSwitchConversion && !debug;
   }