From: Nicolas Geoffray Date: Fri, 29 Apr 2016 12:56:01 +0000 (+0100) Subject: Remove invoke after inlining. X-Git-Tag: android-x86-7.1-r1~45^2~113 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=366728f70c3bf3598cea3c37fa57c7c9428706fa;p=android-x86%2Fart.git Remove invoke after inlining. bug:28460178 (cherry picked from commit 1be7cbd532a41981019f1e89c8ecf404bc9af809) Change-Id: I9a84af048600a4653af284a9b171c2ba4c4dcca5 --- diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 77b72a29f..59de89518 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 167a5757f..7b2c6cbcd 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 7283e8622..286f0d996 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 {