From ff484b95b25a5181a6a8a191cbd11da501c97651 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Wed, 13 Jul 2016 14:13:48 +0100 Subject: Fix a bug in ClassTableGet code generation for IMTs. Introduced by: https://android-review.googlesource.com/#/c/244980/ test:566-polymorphic-inling for fixing x86 crash. Also fixes a performance regression. bug:29188168 Change-Id: Id90cb819c88e7ba3db1cb3c50c517a112ab7d784 --- test/566-polymorphic-inlining/src/Main.java | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'test/566-polymorphic-inlining/src/Main.java') diff --git a/test/566-polymorphic-inlining/src/Main.java b/test/566-polymorphic-inlining/src/Main.java index d39e6ed57b..53852a417c 100644 --- a/test/566-polymorphic-inlining/src/Main.java +++ b/test/566-polymorphic-inlining/src/Main.java @@ -16,6 +16,8 @@ interface Itf { public Class sameInvokeInterface(); + public Class sameInvokeInterface2(); + public Class sameInvokeInterface3(); } public class Main implements Itf { @@ -50,6 +52,8 @@ public class Main implements Itf { testInvokeVirtual(mains[1]); testInvokeInterface(itfs[0]); testInvokeInterface(itfs[1]); + testInvokeInterface2(itfs[0]); + testInvokeInterface2(itfs[1]); $noinline$testInlineToSameTarget(mains[0]); $noinline$testInlineToSameTarget(mains[1]); } @@ -64,9 +68,13 @@ public class Main implements Itf { assertEquals(Itf.class, testInvokeInterface(itfs[0])); assertEquals(Itf.class, testInvokeInterface(itfs[1])); + assertEquals(Itf.class, testInvokeInterface2(itfs[0])); + assertEquals(Itf.class, testInvokeInterface2(itfs[1])); + // This will trigger a deoptimization of the compiled code. assertEquals(OtherSubclass.class, testInvokeVirtual(mains[2])); assertEquals(OtherSubclass.class, testInvokeInterface(itfs[2])); + assertEquals(null, testInvokeInterface2(itfs[2])); // Run this once to make sure we execute the JITted code. $noinline$testInlineToSameTarget(mains[0]); @@ -83,10 +91,28 @@ public class Main implements Itf { return Itf.class; } + public Class sameInvokeInterface2() { + field.getClass(); // null check to ensure we get an inlined frame in the CodeInfo. + return Itf.class; + } + + public Class sameInvokeInterface3() { + field.getClass(); // null check to ensure we get an inlined frame in the CodeInfo. + return Itf.class; + } + public static Class testInvokeInterface(Itf i) { return i.sameInvokeInterface(); } + public static Class testInvokeInterface2(Itf i) { + // Make three interface calls that will do a ClassTableGet to ensure bogus code + // generation of ClassTableGet will crash. + i.sameInvokeInterface(); + i.sameInvokeInterface2(); + return i.sameInvokeInterface3(); + } + public static Class testInvokeVirtual(Main m) { return m.sameInvokeVirtual(); } @@ -120,4 +146,11 @@ class OtherSubclass extends Main { public Class sameInvokeInterface() { return OtherSubclass.class; } + + public Class sameInvokeInterface2() { + return null; + } + public Class sameInvokeInterface3() { + return null; + } } -- cgit v1.2.3-59-g8ed1b