[jvm-l] More on: Small static method marked not entrant, inlining reversed?

Charles Oliver Nutter headius at headius.com
Sat Sep 25 00:50:59 PDT 2010


Thanks for a more complete example, Rémi :)

Also interesting to find out that C1 handles the case better. So the
manual workaround in my code (instanceof + cast) is only necessary on
C2 :(

- Charlie

On Sat, Sep 18, 2010 at 12:25 PM, Rémi Forax <forax at univ-mlv.fr> wrote:
> I take a little time to create a simple test case to reproduce a bug
> found by Charles Nutter with c2.
> see
> http://groups.google.com/group/jvm-languages/browse_thread/thread/6c9e05ecd28fdcd4#
>
> Here is the test case,
> There is 3 classes A, B, C that inherit from AbstractFoo that implements
> Foo.
> The method test do a virtual call to check() and because
> check() is implemented in AbstractFoo we expect that this call should be
> de-virtualized then inlined.
>
> c2 fails, foo.check() is compiled as a virtual call :(
> With c1, there is no problem, CHA works correctly.
>
> Rémi
>
> ------------------------------------------------------------------------------------------------
>
> public class InlineTest {
>  interface Foo {
>    public boolean check(int generation);
>  }
>
>  static class AbstractFoo implements Foo {
>    private final int value;
>
>    protected AbstractFoo(int value) {
>      this.value = value;
>    }
>
>    public boolean check(int generation) {
>      return this.getClass().hashCode() - value == generation;
>    }
>  }
>
>  static class A extends AbstractFoo {
>    public A(int value) {
>      super(value);
>    }
>  }
>  static class B extends AbstractFoo {
>    public B(int value) {
>      super(value);
>    }
>  }
>  static class C extends AbstractFoo {
>    public C(int value) {
>      super(value);
>    }
>  }
>
>  private static final int CONST = A.class.hashCode();
>
>  private static int count;
>
>  private static void test(Foo foo) {
>    if (foo.check(0)) {
>        count += 2;
>        //System.out.println("foo");
>    } else {
>        count += 1;
>        //System.out.println("bar");
>    }
>  }
>
>  public static void main(String[] args) {
>    Foo[] array = new Foo[100000];
>    int threshold = 20000;
>    for(int i=0; i<threshold; i++) {
>      array[i] = new A(CONST);
>    }
>
>    for(int i=threshold; i<array.length; i++) {
>      array[i] = (i%2 == 0)? new B(0): new C(CONST);
>    }
>
>    for(int i=0; i<array.length; i++) {
>      test(array[i]);
>    }
>
>    System.out.println(count);
>  }
> }
>
> --
> You received this message because you are subscribed to the Google Groups
> "JVM Languages" group.
> To post to this group, send email to jvm-languages at googlegroups.com.
> To unsubscribe from this group, send email to
> jvm-languages+unsubscribe at googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/jvm-languages?hl=en.
>
>


More information about the hotspot-compiler-dev mailing list