Merge "Fix splitting for exception overlapping in release mode."
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index ef247a0..df30c18 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -813,8 +813,8 @@
if (overlappingMoveExceptionIntervals) {
for (LiveIntervals intervals : moveExceptionIntervals) {
if (intervals.getUses().size() > 1) {
- LiveIntervalsUse secondUse = intervals.getUses().stream().skip(1).findFirst().get();
- LiveIntervals split = intervals.splitBefore(secondUse.getPosition());
+ LiveIntervals split =
+ intervals.splitBefore(intervals.getFirstUse() + INSTRUCTION_NUMBER_DELTA);
unhandled.add(split);
}
}
@@ -1354,6 +1354,12 @@
if (!hasDedicatedMoveExceptionRegister()) {
return false;
}
+ // If there are that many move exception intervals we don't spent the time
+ // going through them all. In that case it is unlikely that we can reuse the move exception
+ // register in any case.
+ if (moveExceptionIntervals.size() > 1000) {
+ return true;
+ }
for (LiveIntervals moveExceptionInterval : moveExceptionIntervals) {
if (intervals.anySplitOverlaps(moveExceptionInterval)) {
return true;
diff --git a/src/test/examples/catchhandleroverlap/CatchHandlerOverlap.java b/src/test/examples/catchhandleroverlap/CatchHandlerOverlap.java
new file mode 100644
index 0000000..7a4950c
--- /dev/null
+++ b/src/test/examples/catchhandleroverlap/CatchHandlerOverlap.java
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, 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 catchhandleroverlap;
+
+public class CatchHandlerOverlap {
+ private static void f() throws Exception {
+ throw new Exception("f");
+ }
+
+ private static void g() throws Exception {
+ throw new Exception("g");
+ }
+
+ private static void h(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9,
+ int i10, int i11, int i12, int i13, int i14, int i15, int i16, int i17) {
+ System.out.println(i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 +
+ i12 + i13 + i14 + i15 + i16 + i17);
+ try {
+ f();
+ } catch (Exception e0) {
+ try {
+ g();
+ } catch (Exception e1) {
+ System.out.println(e0.getMessage() + " " + e1.getMessage());
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ h(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index 2ac50a6..d8b886c 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -32,6 +32,7 @@
"arrayaccess.ArrayAccess",
"barray.BArray",
"bridge.BridgeMethod",
+ "catchhandleroverlap.CatchHandlerOverlap",
"cse.CommonSubexpressionElimination",
"constants.Constants",
"controlflow.ControlFlow",