Fix NPE rewriting with different catch handlers

Bug: b/354625682
Change-Id: Ice030042828a5c53c273cd328a0d7b0021562a78
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
index 3935555..d63ef16 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
@@ -137,6 +137,12 @@
           if (!canDetachValueIsNullTarget) {
             continue;
           }
+          if (!block.hasEquivalentCatchHandlers(valueIsNullTarget)) {
+            // The new null check is at the if position, while the throw null/NPE is in the
+            // following block. Both should have the same catch handlers for the rewriting to be
+            // correct.
+            continue;
+          }
 
           insertNotNullCheck(
               block,
diff --git a/src/test/java/com/android/tools/r8/regress/B354625682Test.java b/src/test/java/com/android/tools/r8/regress/B354625682Test.java
index e5cafd3..50e2902 100644
--- a/src/test/java/com/android/tools/r8/regress/B354625682Test.java
+++ b/src/test/java/com/android/tools/r8/regress/B354625682Test.java
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.regress;
 
-import static org.junit.Assert.assertThrows;
-
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -42,16 +40,12 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/354625682): Should run successfully.
-    assertThrows(
-        AssertionError.class,
-        () ->
-            testForR8(parameters.getBackend())
-                .addInnerClasses(getClass())
-                .addKeepMainRule(TestClass.class)
-                .setMinApi(parameters)
-                .run(parameters.getRuntime(), TestClass.class)
-                .assertSuccessWithOutputLines(EXPECTED_OUTPUT));
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .setMinApi(parameters)
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
 
   static class TestClass {