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 <[email protected]> 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 [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/jvm-languages?hl=en. > > -- You received this message because you are subscribed to the Google Groups "JVM Languages" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/jvm-languages?hl=en.
