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 {