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)