Add a regression test for b/418568424
Bug: b/418568424
Change-Id: I6f7ae5cad1f0870d637e416b555327ea2c434b90
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/B418719343Test.java b/src/test/java/com/android/tools/r8/ir/optimize/B418719343Test.java
new file mode 100644
index 0000000..00c112b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/B418719343Test.java
@@ -0,0 +1,139 @@
+// Copyright (c) 2025, 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.ir.optimize;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class B418719343Test extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ @Test
+ public void testJvm() throws Exception {
+ parameters.assumeJvmTestParameters();
+ testForJvm(parameters)
+ .addInnerClasses(getClass())
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("-21130949", "over");
+ }
+
+ @Test
+ public void testD8() throws Exception {
+ parameters.assumeDexRuntime();
+ testForD8(parameters)
+ .addInnerClasses(getClass())
+ .release()
+ .compile()
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("-21130949", "over");
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters)
+ .addInnerClasses(getClass())
+ .addKeepClassAndMembersRules(Main.class)
+ .compile()
+ .run(parameters.getRuntime(), Main.class)
+ // TODO(b/418568424): Should succeed with expected output.
+ .applyIf(
+ parameters.isDexRuntime()
+ && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V14_0_0),
+ rr -> rr.assertSuccessWithOutputLines("-21090195", "over"),
+ rr -> rr.assertSuccessWithOutputLines("-21130949", "over"));
+ }
+
+ static class Main {
+ int N = 256;
+ long instanceCount;
+ int iFld;
+ double dFld;
+ int iFld1;
+ long lFld;
+ long lFld1;
+ float fFld;
+
+ void vMeth() {
+ double[][] dArr = new double[N][N];
+ }
+
+ long lMeth(int i9, int i10, long l) {
+ int i11, i12 = 31206, i22, i25 = 159, i26, i27 = 4;
+ byte[] byArr = new byte[N];
+ try {
+ for (i11 = 14; i11 < 17; ++i11) {
+ vMeth();
+ i22 = 1;
+ while (++i22 < 3) {
+ i10 += i22;
+ i12 = iFld1;
+ }
+ for (i26 = 1; i26 < 4; i26++) {
+ instanceCount += i12;
+ lFld += lFld1;
+ i27 -= i22;
+ lFld1 >>= i27;
+ }
+ }
+ } catch (NullPointerException exc2) {
+ int var9 = 0;
+ do var9++;
+ while (var9 < 10000);
+ } catch (ArithmeticException exc3) {
+ fFld *= i25;
+ }
+ long meth_res = i9 + i10 + i25 + FuzzerUtils.checkSum(byArr);
+ return meth_res;
+ }
+
+ int iMeth(int i3, int i4) {
+ int i7;
+ for (i7 = 1; i7 < 4; ++i7) dFld %= lMeth(60, 38876, lFld1);
+ long meth_res = i3;
+ return (int) meth_res;
+ }
+
+ void mainTest(String[] strArr1) {
+ int i = 20377, i1, i2 = 217;
+ for (i1 = 178; i1 > 175; --i1) {
+ iFld -= iMeth(i2, i);
+ lFld1 = -112;
+ }
+ iFld += lFld;
+ i *= iFld;
+ System.out.println(i);
+ }
+
+ public static void main(String[] strArr) {
+ Main _instance = new Main();
+ _instance.mainTest(strArr);
+ System.out.println("over");
+ }
+ }
+
+ static class FuzzerUtils {
+ public static long checkSum(byte[] a) {
+ long sum = 0;
+ for (int j = 0; j < a.length; j++) {
+ sum += (byte) (a[j] / (j + 1) + a[j] % (j + 1));
+ }
+ return sum;
+ }
+ }
+}