Add regression test for b/379347946
This started failing with https://r8.googlesource.com/r8/+/3bb41df4d63dc076f3303de85218a33645512463
Bug: b/379347946
Change-Id: Ica6d329ad01c13273a3b03d47ba10274e5c42f2b
diff --git a/src/test/java/com/android/tools/r8/regress/Regress379347946.java b/src/test/java/com/android/tools/r8/regress/Regress379347946.java
new file mode 100644
index 0000000..99f5827
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/Regress379347946.java
@@ -0,0 +1,220 @@
+// Copyright (c) 2024, 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;
+
+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 java.util.Random;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class Regress379347946 extends TestBase {
+
+ String EXPECTED = "6035364";
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters()
+ .withDexRuntimesStartingFromIncluding(Version.V4_4_4)
+ .withMaximumApiLevel()
+ .build();
+ }
+
+ public Regress379347946(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(Regress379347946.class)
+ .addKeepMainRule(TestClass.class)
+ .addDontObfuscate()
+ .setMinApi(parameters)
+ .compile()
+ .run(parameters.getRuntime(), TestClass.class)
+ // TODO(b/379347946): Should produce same result as D8 below
+ .assertSuccessWithOutputLines("12771252");
+ }
+
+ @Test
+ public void testD8() throws Exception {
+ testForD8(parameters.getBackend())
+ .addInnerClasses(Regress379347946.class)
+ .setMinApi(parameters)
+ .compile()
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines(EXPECTED);
+ }
+
+ @Test
+ public void testD8Release() throws Exception {
+ testForD8(parameters.getBackend())
+ .addInnerClasses(Regress379347946.class)
+ .setMinApi(parameters)
+ .release()
+ .compile()
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines(EXPECTED);
+ }
+
+ static class TestClass {
+ static int N = 400;
+ long instanceCount;
+ int iFld;
+ float fFld;
+ static int[][] iArrFld = new int[N][N];
+ long vMeth_check_sum;
+
+ short sMeth(int i10, int i11, int i12) {
+ int i13, i14, i15 = 61554, i16 = 47, i17 = 78;
+ short s = 10384;
+ i13 = 1;
+ do
+ for (i14 = 1; 13 > i14; ++i14) {
+ double d1;
+ d1 = i13;
+ for (i16 = 1; i16 < 2; i16++) {
+ i15 += i16;
+ i17 = i11;
+ i10 = (int) instanceCount;
+ s -= d1;
+ i11 -= 42418;
+ }
+ }
+ while (++i13 < 123);
+ long meth_res = i10 + i15 + i16 + i17 + s;
+ return (short) meth_res;
+ }
+
+ void vMeth(long l1, long l2) {
+ int i9 = 12;
+ long[][] lArr = new long[N][N];
+ for (int j = 0; j < lArr.length; j++) {
+ for (int j1 = 0; j1 < lArr[j].length; j1++) {
+ lArr[j][j1] = (j1 % 2 == 0) ? 21645L + j1 : 21645L - j1;
+ }
+ }
+ iArrFld[1][1] -= sMeth(i9, i9, i9) * i9;
+ long sum = 0;
+ for (int j = 0; j < lArr.length; j++) {
+ long sum1 = 0;
+ for (int j1 = 0; j1 < lArr[j].length; j1++) {
+ sum1 += (lArr[j][j1] / (j1 + 1) + lArr[j][j1] % (j1 + 1));
+ }
+ sum += sum1;
+ }
+ vMeth_check_sum += sum;
+ }
+
+ int iMeth(int i7, long l, int i8) {
+ vMeth(instanceCount, l);
+ long meth_res = l;
+ return (int) meth_res;
+ }
+
+ void mainTest(String[] strArr1) {
+ int i = 90;
+ int i1;
+ int i2 = 153;
+ int i3 = 15;
+ int i4 = 1;
+ int i5 = -85;
+ int i6 = 57107;
+ int[][] iArr = new int[N][N];
+ double d = 98.33365;
+ byte by = 11;
+ long l3 = 1312947818L;
+ short s2 = 19614;
+ do
+ for (i1 = 5; 194 > i1; ++i1) {
+ iArr[i][i] = i3;
+ d = Math.min(iFld, by);
+ for (; i5 < 2; ++i5) {
+ String[] var19 = {};
+ c59.main(var19);
+ i3 *= iMeth(iFld, instanceCount, i6);
+ switch (i) {
+ case 205:
+ System.out.println("i = " + i);
+ i5 = i2;
+ case 283:
+ by *= l3;
+ case 352:
+ s2 = (short) instanceCount;
+ case 230:
+ iArrFld[196] = FuzzerUtils.int1array(N, 251);
+ case 362:
+ l3 += fFld;
+ case 386:
+ i2 = i6;
+ case 392:
+ i6 = i4;
+ case 332:
+ i4 <<= s2;
+ }
+ }
+ }
+ while (++i < 129);
+ double d_print = Double.doubleToLongBits(d);
+ long sum = 0;
+ for (int j = 0; j < iArrFld.length; j++) {
+ long sum1 = 0;
+ for (int j1 = 0; j1 < iArrFld[j].length; j1++) {
+ sum1 += (iArrFld[j][j1] / (j1 + 1) + iArrFld[j][j1] % (j1 + 1));
+ }
+ sum += sum1;
+ }
+ long iArrFld_check_sum = sum;
+ System.out.println(iArrFld_check_sum);
+ }
+
+ public static void main(String[] strArr) {
+ TestClass _instance = new TestClass();
+ _instance.mainTest(strArr);
+ }
+ }
+
+ static class c59 {
+ static void main(String[] args) {
+ c59Class.main(args);
+ }
+
+ static class c59Class {
+ static void bar() {
+ try (AutoCloseableResource resource = new c59.AutoCloseableResource()) {
+ } catch (Exception e) {
+ }
+ }
+
+ static void main(String[] args) {
+ c59Class.bar();
+ }
+ }
+
+ static class AutoCloseableResource implements AutoCloseable {
+ public void close() {
+ throw new java.lang.RuntimeException();
+ }
+ }
+ }
+
+ static class FuzzerUtils {
+ public static Random random = new Random(1);
+
+ public static int[] int1array(int sz, int seed) {
+ int[] ret = new int[sz];
+ for (int j = 0; j < ret.length; j++) {
+ ret[j] = (j % 2 == 0) ? seed + j : seed - j;
+ }
+ return ret;
+ }
+ }
+}