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;
+    }
+  }
+}