On 07/12/2014 08:08 PM, Charles Oliver Nutter wrote:

I played with this some years ago. Doesn't it just become recursive, because it won't inline through the dynamicInvoker?

- Charlie (mobile)


It's clearly recursive.
I don't think it's a good idea to try to fully inline it anyway, it will generate too much assembly code. The actual problem is that the JIT generate assembly code and then try again, and again, and again ...

Rémi

On Jul 12, 2014 9:36 AM, "Remi Forax" <fo...@univ-mlv.fr <mailto:fo...@univ-mlv.fr>> wrote:

    It seems that the JIT is lost with whe there is a loopy callsite
    and never stabilize (or the steady state is after the program ends).

    import java.lang.invoke.MethodHandle;
    import java.lang.invoke.MethodHandles;
    import java.lang.invoke.MethodType;
    import java.lang.invoke.MutableCallSite;

    public class Loop {
      static class LoopyCS extends MutableCallSite {
        public LoopyCS() {
          super(MethodType.methodType(void.class, int.class));

          MethodHandle target = dynamicInvoker();
          target = MethodHandles.filterArguments(target, 0, FOO);
          target = MethodHandles.guardWithTest(ZERO,
              target,
    MethodHandles.dropArguments(MethodHandles.constant(int.class,
    0).asType(MethodType.methodType(void.class)), 0, int.class));
          setTarget(target);
        }
      }

      static final MethodHandle FOO, ZERO;
      static {
        try {
          FOO = MethodHandles.lookup().findStatic(Loop.class, "foo",
    MethodType.methodType(int.class, int.class));
          ZERO = MethodHandles.lookup().findStatic(Loop.class, "zero",
    MethodType.methodType(boolean.class, int.class));
        } catch (NoSuchMethodException | IllegalAccessException e) {
          throw new AssertionError(e);
        }
      }

      private static boolean zero(int i) {
        return i != 0;
      }

      private static int foo(int i) {
        COUNTER++;
        return i - 1;
      }

      private static int COUNTER = 0;

      public static void main(String[] args) throws Throwable {
        for(int i=0; i<100_000; i++) {
          new LoopyCS().getTarget().invokeExact(1_000);
        }
        System.out.println(COUNTER);
      }
    }

    cheers,
    Rémi


    _______________________________________________
    mlvm-dev mailing list
    mlvm-dev@openjdk.java.net <mailto:mlvm-dev@openjdk.java.net>
    http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev



_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to