diff options
| -rw-r--r-- | compiler/optimizing/inliner.cc | 1 | ||||
| -rw-r--r-- | test/566-polymorphic-inlining/polymorphic_inline.cc | 1 | ||||
| -rw-r--r-- | test/566-polymorphic-inlining/src/Main.java | 23 |
3 files changed, 25 insertions, 0 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 247f82574a..41a15dccaa 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -732,6 +732,7 @@ bool HInliner::TryInlinePolymorphicCallToSameTarget(HInvoke* invoke_instruction, if (return_replacement != nullptr) { invoke_instruction->ReplaceWith(return_replacement); } + invoke_instruction->GetBlock()->RemoveInstruction(invoke_instruction); } // Run type propagation to get the guard typed. diff --git a/test/566-polymorphic-inlining/polymorphic_inline.cc b/test/566-polymorphic-inlining/polymorphic_inline.cc index 167a5757f9..7b2c6cbcd5 100644 --- a/test/566-polymorphic-inlining/polymorphic_inline.cc +++ b/test/566-polymorphic-inlining/polymorphic_inline.cc @@ -60,6 +60,7 @@ extern "C" JNIEXPORT void JNICALL Java_Main_ensureJittedAndPolymorphicInline(JNI do_checks(cls, "testInvokeVirtual"); do_checks(cls, "testInvokeInterface"); + do_checks(cls, "$noinline$testInlineToSameTarget"); } } // namespace art diff --git a/test/566-polymorphic-inlining/src/Main.java b/test/566-polymorphic-inlining/src/Main.java index 7283e86227..286f0d996e 100644 --- a/test/566-polymorphic-inlining/src/Main.java +++ b/test/566-polymorphic-inlining/src/Main.java @@ -25,6 +25,12 @@ public class Main implements Itf { } } + public static void assertEquals(int expected, int actual) { + if (expected != actual) { + throw new Error("Expected " + expected + ", got " + actual); + } + } + public static void main(String[] args) throws Exception { System.loadLibrary(args[0]); Main[] mains = new Main[3]; @@ -41,6 +47,8 @@ public class Main implements Itf { testInvokeVirtual(mains[1]); testInvokeInterface(itfs[0]); testInvokeInterface(itfs[1]); + $noinline$testInlineToSameTarget(mains[0]); + $noinline$testInlineToSameTarget(mains[1]); } ensureJittedAndPolymorphicInline(); @@ -56,6 +64,10 @@ public class Main implements Itf { // This will trigger a deoptimization of the compiled code. assertEquals(OtherSubclass.class, testInvokeVirtual(mains[2])); assertEquals(OtherSubclass.class, testInvokeInterface(itfs[2])); + + // Run this once to make sure we execute the JITted code. + $noinline$testInlineToSameTarget(mains[0]); + assertEquals(20001, counter); } public Class sameInvokeVirtual() { @@ -76,9 +88,20 @@ public class Main implements Itf { return m.sameInvokeVirtual(); } + public static void $noinline$testInlineToSameTarget(Main m) { + if (doThrow) throw new Error(""); + m.increment(); + } + public Object field = new Object(); public static native void ensureJittedAndPolymorphicInline(); + + public void increment() { + counter++; + } + public static int counter = 0; + public static boolean doThrow = false; } class Subclass extends Main { |