Disregard constants in simple inlining constraint analysis

Fixes: b/331337747
Change-Id: I18dae2e69f0c06bfd0178b8d2789cb810d72afb7
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintAnalysis.java
index 63a2886..ecc3720 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintAnalysis.java
@@ -103,7 +103,7 @@
       SimpleInliningConstraint instructionConstraint =
           computeConstraintForInstructionNotToMaterialize(instruction);
       if (instructionConstraint.isAlways()) {
-        assert instruction.isAssume();
+        assert instruction.isAssume() || instruction.isConstInstruction();
       } else if (instructionConstraint.isNever()) {
         instructionDepth++;
       } else {
@@ -128,6 +128,13 @@
     if (instruction.isAssume()) {
       return AlwaysSimpleInliningConstraint.getInstance();
     }
+    // We treat const instructions as non-materializing, although they may actually materialize.
+    // In practice, since we limit the number of materializing instructions to one, only few
+    // constants should remain after inlining (e.g., if the materializing instruction is an invoke
+    // that uses constants as in-values).
+    if (instruction.isConstInstruction()) {
+      return AlwaysSimpleInliningConstraint.getInstance();
+    }
     if (instruction.isInvokeVirtual()) {
       InvokeVirtual invoke = instruction.asInvokeVirtual();
       if (invoke.getInvokedMethod().isIdenticalTo(dexItemFactory.objectMembers.getClass)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningTest.java
index 3d8006e..29a4ece 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SwitchWithSimpleCasesInliningTest.java
@@ -5,7 +5,7 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
@@ -46,9 +46,7 @@
 
               MethodSubject mainMethodSubject = mainClassSubject.mainMethod();
               assertThat(mainMethodSubject, isPresent());
-              // TODO(b/331337747): Account for constant canonicalization in constraint analysis.
-              assertEquals(
-                  parameters.isCfRuntime(),
+              assertTrue(
                   mainMethodSubject
                       .streamInstructions()
                       .filter(InstructionSubject::isConstString)