diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B418568424Test.java b/src/test/java/com/android/tools/r8/ir/regalloc/B418568424Test.java
new file mode 100644
index 0000000..4558499
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B418568424Test.java
@@ -0,0 +1,114 @@
+// 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.regalloc;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+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 B418568424Test extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    AssertUtils.assertFailsCompilationIf(
+        parameters.isDexRuntime()
+            && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.M),
+        () ->
+            testForR8(parameters)
+                .addInnerClasses(getClass())
+                .addKeepClassAndMembersRules(Main.class)
+                .compile()
+                .run(parameters.getRuntime(), Main.class)
+                .assertSuccess());
+  }
+
+  static class Main {
+
+    final int N = 256;
+    int iFld;
+    long vMeth2_check_sum;
+
+    void vMeth2(long l1, int i7, long l2) {
+      long l3;
+      int i8 = -5;
+      int i10 = 13;
+      int i11 = -234;
+      int i13 = -5;
+      int i14 = 11;
+      int var6 = 0;
+      int var7 = 0;
+      while (var7 < 8) {
+        int[][] iArr = new int[N][var6];
+        var6 = N;
+        var7++;
+      }
+      int[][] iArr = new int[N][N];
+      double d = 6.51399, d1 = 106.34938;
+      float f = 36.859F;
+      boolean b = true;
+      byte by = 35;
+      for (l3 = 9; l3 < 12; ++l3)
+        for (d = 1; d < 4; d++)
+          switch ((int) d) {
+            case 64:
+              for (; i11 < 4; ++i11) {
+                i7 -= i7;
+                i8 *= i10;
+              }
+              for (; i13 < 4; ++i13) {
+                i14 -= i14;
+                iFld += (int) l3;
+                f += i7;
+                i10 += i13;
+                d1 += i14;
+                l2 = iFld;
+              }
+            case 54:
+              byte var5 = (byte) i8;
+              by = var5;
+          }
+      vMeth2_check_sum +=
+          l1 + l2 + d + f + i14 + d1 + (b ? 1 : 0) + by + FuzzerUtils.checkSum(iArr);
+    }
+
+    public static void main(String[] args) {
+      System.out.println("Hello world");
+    }
+  }
+
+  static class FuzzerUtils {
+
+    public static long checkSum(int[][] a) {
+      long sum = 0;
+      for (int j = 0; j < a.length; j++) {
+        sum += checkSum(a[j]);
+      }
+      return sum;
+    }
+
+    public static long checkSum(int[] a) {
+      long sum = 0;
+      for (int j = 0; j < a.length; j++) {
+        sum += (a[j] / (j + 1) + a[j] % (j + 1));
+      }
+      return sum;
+    }
+  }
+}
