diff options
| author | 2022-12-06 18:13:10 +0000 | |
|---|---|---|
| committer | 2022-12-07 14:27:00 +0000 | |
| commit | 343b9d9e103e281a4c4c337edb83d23473e28bcc (patch) | |
| tree | 43eaa2d050ba315fe83bcdb2c7e2f6272bf42073 /test/2241-checker-inline-try-catch/src/Main.java | |
| parent | e3b4be4508b24b45596be5cd0262412770a13f6b (diff) | |
Allow inlining invokes that contain try catches into catch blocks
Since catch blocks are never considered try blocks, we can
guarantee that its invokes are not inside a TryBoundary (which
is the blocker for enabling inlining of try catch invokes inside
try blocks).
Bug: 227283224
Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b
Change-Id: I747e2e8c2515e36041ad3966ca6a6388ef7d91df
Diffstat (limited to 'test/2241-checker-inline-try-catch/src/Main.java')
| -rw-r--r-- | test/2241-checker-inline-try-catch/src/Main.java | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/test/2241-checker-inline-try-catch/src/Main.java b/test/2241-checker-inline-try-catch/src/Main.java index a76a99bd89..a80fbd7053 100644 --- a/test/2241-checker-inline-try-catch/src/Main.java +++ b/test/2241-checker-inline-try-catch/src/Main.java @@ -23,7 +23,8 @@ public class Main { $noinline$testTryCatchFinally(); $noinline$testTryCatchFinallyDifferentInputs(); $noinline$testRecursiveTryCatch(); - $noinline$testDoNotInlineInsideTryOrCatch(); + $noinline$testDoNotInlineInsideTryInlineInsideCatch(); + $noinline$testInlineInsideNestedCatches(); $noinline$testBeforeAfterTryCatch(); $noinline$testDifferentTypes(); $noinline$testRawThrow(); @@ -88,28 +89,46 @@ public class Main { $noinline$assertEquals(1, $inline$OOBTryCatchLevel4(numbers)); } - // Tests that we don't inline inside outer tries or catches. - /// CHECK-START: void Main.$noinline$testDoNotInlineInsideTryOrCatch() inliner (before) - /// CHECK: InvokeStaticOrDirect method_name:Main.DoNotInlineOOBTryCatch + // Tests that we don't inline inside outer tries, but we do inline inside of catches. + /// CHECK-START: void Main.$noinline$testDoNotInlineInsideTryInlineInsideCatch() inliner (before) /// CHECK: InvokeStaticOrDirect method_name:Main.DoNotInlineOOBTryCatch + /// CHECK: InvokeStaticOrDirect method_name:Main.$inline$OOBTryCatch - /// CHECK-START: void Main.$noinline$testDoNotInlineInsideTryOrCatch() inliner (after) - /// CHECK: InvokeStaticOrDirect method_name:Main.DoNotInlineOOBTryCatch + /// CHECK-START: void Main.$noinline$testDoNotInlineInsideTryInlineInsideCatch() inliner (after) /// CHECK: InvokeStaticOrDirect method_name:Main.DoNotInlineOOBTryCatch - private static void $noinline$testDoNotInlineInsideTryOrCatch() { + private static void $noinline$testDoNotInlineInsideTryInlineInsideCatch() { int val = 0; try { int[] numbers = {}; val = DoNotInlineOOBTryCatch(numbers); } catch (Exception ex) { unreachable(); - // This is unreachable but we will still compile it so it works for checker purposes + // This is unreachable but we will still compile it so it works for checking that it inlines. int[] numbers = {}; - DoNotInlineOOBTryCatch(numbers); + $inline$OOBTryCatch(numbers); } $noinline$assertEquals(1, val); } + private static void $noinline$emptyMethod() {} + + private static void $inline$testInlineInsideNestedCatches_inner() { + try { + $noinline$emptyMethod(); + } catch (Exception ex) { + int[] numbers = {}; + $noinline$assertEquals(1, $inline$OOBTryCatch(numbers)); + } + } + + private static void $noinline$testInlineInsideNestedCatches() { + try { + $noinline$emptyMethod(); + } catch (Exception ex) { + $inline$testInlineInsideNestedCatches_inner(); + } + } + // Tests that outer tries or catches don't affect as long as we are not inlining the inner // try/catch inside of them. private static void $noinline$testBeforeAfterTryCatch() { |