Version 1.6.81 Cherry pick: Fix count error in IdempotentFunctionCallCanonicalizer CL: https://r8-review.googlesource.com/c/r8/+/49531 Bug: 150688800 Change-Id: I4eb6f94a5bdabbc7fd6a5e0cb6cb721304aeea50
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java index b2cd485..8c6b22e 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 = "1.6.80"; + public static final String LABEL = "1.6.81"; private Version() { }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java index 0195c84..e5a7fc9 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
@@ -270,8 +270,12 @@ InstructionListIterator it = entryBlock.listIterator(code); while (it.hasNext()) { Instruction current = it.next(); - if (current.hasOutValue() && canonicalizedInvoke.inValues().contains(current.outValue())) { - numberOfInValuePassed++; + if (current.hasOutValue()) { + for (Value inValue : canonicalizedInvoke.inValues()) { + if (inValue == current.outValue()) { + numberOfInValuePassed++; + } + } } if (numberOfInValuePassed == canonicalizedInvoke.inValues().size()) { // If this invocation uses arguments and this iteration ends in the middle of Arguments,
diff --git a/src/test/java/com/android/tools/r8/regress/b150688800/IdempotentCountErrorTest.java b/src/test/java/com/android/tools/r8/regress/b150688800/IdempotentCountErrorTest.java new file mode 100644 index 0000000..52ed2e5 --- /dev/null +++ b/src/test/java/com/android/tools/r8/regress/b150688800/IdempotentCountErrorTest.java
@@ -0,0 +1,61 @@ +// 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.regress.b150688800; + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.utils.StringUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class IdempotentCountErrorTest extends TestBase { + + static final String EXPECTED = StringUtils.lines("0.0"); + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public IdempotentCountErrorTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .enableInliningAnnotations() + .enableMemberValuePropagationAnnotations() + .addInnerClasses(IdempotentCountErrorTest.class) + .addKeepMainRule(TestClass.class) + .setMinApi(parameters.getApiLevel()) + .run(parameters.getRuntime(), TestClass.class) + .disassemble() + .assertSuccessWithOutput(EXPECTED); + } + + static class TestClass { + + @NeverInline + @NeverPropagateValue + public static double twoInputValues(double x, double y) { + return x + y; + } + + public static void main(String[] args) { + if (args.length > 42) { + System.out.println(twoInputValues(0, 0)); + } else { + System.out.println(twoInputValues(0, 0)); + } + } + } +}