OSDN Git Service

Remove invoke after inlining.
authorNicolas Geoffray <ngeoffray@google.com>
Fri, 29 Apr 2016 12:56:01 +0000 (13:56 +0100)
committerNicolas Geoffray <ngeoffray@google.com>
Fri, 29 Apr 2016 14:08:21 +0000 (15:08 +0100)
bug:28460178

(cherry picked from commit 1be7cbd532a41981019f1e89c8ecf404bc9af809)

Change-Id: I9a84af048600a4653af284a9b171c2ba4c4dcca5

compiler/optimizing/inliner.cc
test/566-polymorphic-inlining/polymorphic_inline.cc
test/566-polymorphic-inlining/src/Main.java

index 77b72a2..59de895 100644 (file)
@@ -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.
index 167a575..7b2c6cb 100644 (file)
@@ -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
index 7283e86..286f0d9 100644 (file)
@@ -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 {