diff --git a/src/share/vm/opto/subnode.cpp b/src/share/vm/opto/subnode.cpp index d7c3cc87e2a8665a787398c3e0d9460da465a7d1..ae88d736b10bab41d9c563676cdc6a24b95601e0 100644 --- a/src/share/vm/opto/subnode.cpp +++ b/src/share/vm/opto/subnode.cpp @@ -640,7 +640,11 @@ const Type *CmpPNode::sub( const Type *t1, const Type *t2 ) const { if (klass0 && klass1 && kps != 1 && // both or neither are klass pointers klass0->is_loaded() && !klass0->is_interface() && // do not trust interfaces - klass1->is_loaded() && !klass1->is_interface()) { + klass1->is_loaded() && !klass1->is_interface() && + (!klass0->is_obj_array_klass() || + !klass0->as_obj_array_klass()->base_element_klass()->is_interface()) && + (!klass1->is_obj_array_klass() || + !klass1->as_obj_array_klass()->base_element_klass()->is_interface())) { bool unrelated_classes = false; // See if neither subclasses the other, or if the class on top // is precise. In either of these cases, the compare is known diff --git a/test/compiler/6832293/Test.java b/test/compiler/6832293/Test.java new file mode 100644 index 0000000000000000000000000000000000000000..7a2c74d3ca19612a72caf277327a4c6bba5be732 --- /dev/null +++ b/test/compiler/6832293/Test.java @@ -0,0 +1,135 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +/* + * @test + * @bug 6832293 + * @summary JIT compiler got wrong result in type checking with -server + * @run main/othervm -Xcomp -XX:CompileOnly=Test.run Test + */ + +import java.io.PrintStream; + +interface SomeInterface { + int SEVENS = 777; +} + +interface AnotherInterface { + int THIRDS = 33; +} + +class SomeClass implements SomeInterface { + int i; + + SomeClass(int i) { + this.i = i; + } +} + +class ImmediateSubclass extends SomeClass implements SomeInterface { + float f; + + ImmediateSubclass(int i, float f) { + super(i); + this.f = f; + } +} + +final class FinalSubclass extends ImmediateSubclass implements AnotherInterface { + double d; + + FinalSubclass(int i, float f, double d) { + super(i, f); + this.d = d; + } +} + +public class Test { + + public static void main(String args[]) throws Exception{ + /* try to pre initialize */ + SomeClass[] a=new SomeClass[10]; + Class.forName("ImmediateSubclass"); + Class.forName("FinalSubclass"); + System.exit(run(args, System.out) + 95/*STATUS_TEMP*/); + } + + static int errorStatus = 0/*STATUS_PASSED*/; + + static void errorAlert(PrintStream out, int errorLevel) { + out.println("Test: failure #" + errorLevel); + errorStatus = 2/*STATUS_FAILED*/; + } + + static SomeClass[] v2 = new FinalSubclass[4]; + + public static int run(String args[],PrintStream out) { + int i [], j []; + SomeInterface u [], v[] []; + AnotherInterface w []; + SomeClass x [] []; + + i = new int [10]; + i[0] = 777; + j = (int []) i; + if (j != i) + errorAlert(out, 2); + else if (j.length != 10) + errorAlert(out, 3); + else if (j[0] != 777) + errorAlert(out, 4); + + v = new SomeClass [3] []; + x = (SomeClass [] []) v; + if (! (x instanceof SomeInterface [] [])) + errorAlert(out, 5); + else if (! (x instanceof SomeClass [] [])) + errorAlert(out, 6); + else if (x != v) + errorAlert(out, 7); + + x[0] = (SomeClass []) new ImmediateSubclass [4]; + if (! (x[0] instanceof ImmediateSubclass [])) + errorAlert(out, 8); + else if (x[0].length != 4) + errorAlert(out, 9); + + x[1] = (SomeClass []) v2; + if (! (x[1] instanceof FinalSubclass [])) + errorAlert(out, 10); + else if (x[1].length != 4) + errorAlert(out, 11); + + w = (AnotherInterface []) x[1]; + if (! (w instanceof FinalSubclass [])) + errorAlert(out, 12); + else if (w != x[1]) + errorAlert(out, 13); + else if (w.length != 4) + errorAlert(out, 14); + + return errorStatus; + } +} +