[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