Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8062280

C2: inlining failure due to access checks being too strict

    XMLWordPrintable

    Details

    • Type: Enhancement
    • Status: Resolved
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: 8u60, 9
    • Fix Version/s: 9
    • Component/s: hotspot
    • Labels:
      None
    • Subcomponent:
    • Resolved In Build:
      b64

      Backports

        Description

        Paul Sandoz reported a problem with method inlining through method handles:
        http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2014-October/015993.html

        _@ 48 MHInlineTest::testPackageMH (24 bytes) inline (hot)
        __@ 7 java.lang.invoke.LambdaForm$MH/314265080::invokeExact_MT (17 bytes) force inline by annotation
        ___@ 2 java.lang.invoke.Invokers::checkExactType (30 bytes) force inline by annotation
        ____@ 11 java.lang.invoke.MethodHandle::type (5 bytes) accessor
        ___@ 13 java.lang.invoke.LambdaForm$DMH/285377351::invokeVirtual_LL_V (15 bytes) force inline by annotation
        ____@ 1 java.lang.invoke.DirectMethodHandle::internalMemberName (8 bytes) force inline by annotation
        ____@ 11 MHInlineTest$A::package_x (6 bytes) virtual call
         
        Failing test:
        public class MHInlineTest {
            public static class A {
                void package_x(String s) { ... }
            }

            public static final class B extends A {
                void package_x(String s) { ... }
            }

            static final MethodHandle A_PUBLIC_X;
            static final MethodHandle A_PROTECTED_X;
            static final MethodHandle A_PACKAGE_X;
            static final MethodHandle A_PACKAGE_FINAL_X;

            static {
                try {
                    A_PACKAGE_X = MethodHandles.lookup().findVirtual(
                            A.class, "package_x", MethodType.methodType(void.class, String.class));
                } catch (Exception e) {
                    throw new Error(e);
                }
            }

            static final A a = new B();

            public static void main(String[] args) {
                for (int i = 0; i < 1000_0000; i++) {
                    try {
                        A_PROTECTED_X.invokeExact(a, x);
                    } catch (Throwable throwable) {
                        throw new Error(throwable);
                    }
                }
            }
        }

          Attachments

            Issue Links

              Activity

                People

                Assignee:
                vlivanov Vladimir Ivanov
                Reporter:
                vlivanov Vladimir Ivanov
                Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                  Dates

                  Created:
                  Updated:
                  Resolved: