Path: blob/master/test/hotspot/jtreg/compiler/stable/TestStableObject.java
41149 views
/*1* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test TestStableObject25* @summary tests on stable fields and arrays26* @library /test/lib /27* @modules java.base/jdk.internal.misc28* @modules java.base/jdk.internal.vm.annotation29* @build sun.hotspot.WhiteBox30*31* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp32* -XX:CompileOnly=::get,::get1,::get2,::get3,::get433* -XX:-TieredCompilation34* -XX:+FoldStableValues35* compiler.stable.TestStableObject36* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp37* -XX:CompileOnly=::get,::get1,::get2,::get3,::get438* -XX:-TieredCompilation39* -XX:-FoldStableValues40* compiler.stable.TestStableObject41*42* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp43* -XX:CompileOnly=::get,::get1,::get2,::get3,::get444* -XX:+TieredCompilation -XX:TieredStopAtLevel=145* -XX:+FoldStableValues46* compiler.stable.TestStableObject47* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp48* -XX:CompileOnly=::get,::get1,::get2,::get3,::get449* -XX:+TieredCompilation -XX:TieredStopAtLevel=150* -XX:-FoldStableValues51* compiler.stable.TestStableObject52*/5354package compiler.stable;5556import jdk.internal.vm.annotation.Stable;5758import java.lang.reflect.InvocationTargetException;5960public class TestStableObject {61static final boolean isStableEnabled = StableConfiguration.isStableEnabled;6263public static void main(String[] args) throws Exception {64run(DefaultValue.class);65run(ObjectStable.class);66run(DefaultStaticValue.class);67run(StaticObjectStable.class);68run(VolatileObjectStable.class);6970// @Stable arrays: Dim 1-471run(ObjectArrayDim1.class);72run(ObjectArrayDim2.class);73run(ObjectArrayDim3.class);74run(ObjectArrayDim4.class);7576// @Stable Object field: dynamic arrays77run(ObjectArrayLowerDim0.class);78run(ObjectArrayLowerDim1.class);79run(ObjectArrayLowerDim2.class);8081// Nested @Stable fields82run(NestedStableField.class);83run(NestedStableField1.class);84run(NestedStableField2.class);85run(NestedStableField3.class);8687if (failed) {88throw new Error("TEST FAILED");89}90}9192/* ==================================================== */9394enum Values {A, B, C, D, E, F}9596static class DefaultValue {97public @Stable Object v;9899public static final DefaultValue c = new DefaultValue();100public static Object get() { return c.v; }101public static void test() throws Exception {102Object val1 = get();103c.v = Values.A; Object val2 = get();104assertEquals(val1, null);105assertEquals(val2, Values.A);106}107}108109/* ==================================================== */110111static class ObjectStable {112public @Stable Values v;113114public static final ObjectStable c = new ObjectStable ();115public static Values get() { return c.v; }116public static void test() throws Exception {117c.v = Values.A; Values val1 = get();118c.v = Values.B; Values val2 = get();119assertEquals(val1, Values.A);120assertEquals(val2, (isStableEnabled ? Values.A : Values.B));121}122}123124/* ==================================================== */125126static class DefaultStaticValue {127public static @Stable Object v;128129public static final DefaultStaticValue c = new DefaultStaticValue();130public static Object get() { return c.v; }131public static void test() throws Exception {132Object val1 = get();133c.v = Values.A; Object val2 = get();134assertEquals(val1, null);135assertEquals(val2, Values.A);136}137}138139/* ==================================================== */140141static class StaticObjectStable {142public static @Stable Values v;143144public static final ObjectStable c = new ObjectStable ();145public static Values get() { return c.v; }146public static void test() throws Exception {147c.v = Values.A; Values val1 = get();148c.v = Values.B; Values val2 = get();149assertEquals(val1, Values.A);150assertEquals(val2, (isStableEnabled ? Values.A : Values.B));151}152}153154/* ==================================================== */155156static class VolatileObjectStable {157public @Stable volatile Values v;158159public static final VolatileObjectStable c = new VolatileObjectStable ();160public static Values get() { return c.v; }161public static void test() throws Exception {162c.v = Values.A; Values val1 = get();163c.v = Values.B; Values val2 = get();164assertEquals(val1, Values.A);165assertEquals(val2, (isStableEnabled ? Values.A : Values.B));166}167}168169/* ==================================================== */170// @Stable array == field && all components are stable171172static class ObjectArrayDim1 {173public @Stable Object[] v;174175public static final ObjectArrayDim1 c = new ObjectArrayDim1();176public static Object get() { return c.v[0]; }177public static Object get1() { return c.v[10]; }178public static Object[] get2() { return c.v; }179public static void test() throws Exception {180{181c.v = new Object[1]; c.v[0] = Values.A; Object val1 = get();182c.v[0] = Values.B; Object val2 = get();183assertEquals(val1, Values.A);184assertEquals(val2, (isStableEnabled ? Values.A : Values.B));185186c.v = new Object[1]; c.v[0] = Values.C; Object val3 = get();187assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)188: Values.C));189}190191{192c.v = new Object[20]; c.v[10] = Values.A; Object val1 = get1();193c.v[10] = Values.B; Object val2 = get1();194assertEquals(val1, Values.A);195assertEquals(val2, (isStableEnabled ? Values.A : Values.B));196197c.v = new Object[20]; c.v[10] = Values.C; Object val3 = get1();198assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)199: Values.C));200}201202{203c.v = new Object[1]; Object[] val1 = get2();204c.v = new Object[1]; Object[] val2 = get2();205assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));206}207}208}209210/* ==================================================== */211212static class ObjectArrayDim2 {213public @Stable Object[][] v;214215public static final ObjectArrayDim2 c = new ObjectArrayDim2();216public static Object get() { return c.v[0][0]; }217public static Object[] get1() { return c.v[0]; }218public static Object[][] get2() { return c.v; }219public static void test() throws Exception {220{221c.v = new Object[1][1]; c.v[0][0] = Values.A; Object val1 = get();222c.v[0][0] = Values.B; Object val2 = get();223assertEquals(val1, Values.A);224assertEquals(val2, (isStableEnabled ? Values.A : Values.B));225226c.v = new Object[1][1]; c.v[0][0] = Values.C; Object val3 = get();227assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)228: Values.C));229230c.v[0] = new Object[1]; c.v[0][0] = Values.D; Object val4 = get();231assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)232: Values.D));233}234235{236c.v = new Object[1][1]; Object[] val1 = get1();237c.v[0] = new Object[1]; Object[] val2 = get1();238assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));239}240241{242c.v = new Object[1][1]; Object[][] val1 = get2();243c.v = new Object[1][1]; Object[][] val2 = get2();244assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));245}246}247}248249/* ==================================================== */250251static class ObjectArrayDim3 {252public @Stable Object[][][] v;253254public static final ObjectArrayDim3 c = new ObjectArrayDim3();255public static Object get() { return c.v[0][0][0]; }256public static Object[] get1() { return c.v[0][0]; }257public static Object[][] get2() { return c.v[0]; }258public static Object[][][] get3() { return c.v; }259public static void test() throws Exception {260{261c.v = new Object[1][1][1]; c.v[0][0][0] = Values.A; Object val1 = get();262c.v[0][0][0] = Values.B; Object val2 = get();263assertEquals(val1, Values.A);264assertEquals(val2, (isStableEnabled ? Values.A : Values.B));265266c.v = new Object[1][1][1]; c.v[0][0][0] = Values.C; Object val3 = get();267assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)268: Values.C));269270c.v[0] = new Object[1][1]; c.v[0][0][0] = Values.D; Object val4 = get();271assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)272: Values.D));273274c.v[0][0] = new Object[1]; c.v[0][0][0] = Values.E; Object val5 = get();275assertEquals(val5, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)276: Values.E));277}278279{280c.v = new Object[1][1][1]; Object[] val1 = get1();281c.v[0][0] = new Object[1]; Object[] val2 = get1();282assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));283}284285{286c.v = new Object[1][1][1]; Object[][] val1 = get2();287c.v[0] = new Object[1][1]; Object[][] val2 = get2();288assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));289}290291{292c.v = new Object[1][1][1]; Object[][][] val1 = get3();293c.v = new Object[1][1][1]; Object[][][] val2 = get3();294assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));295}296}297}298299/* ==================================================== */300301static class ObjectArrayDim4 {302public @Stable Object[][][][] v;303304public static final ObjectArrayDim4 c = new ObjectArrayDim4();305public static Object get() { return c.v[0][0][0][0]; }306public static Object[] get1() { return c.v[0][0][0]; }307public static Object[][] get2() { return c.v[0][0]; }308public static Object[][][] get3() { return c.v[0]; }309public static Object[][][][] get4() { return c.v; }310public static void test() throws Exception {311{312c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.A; Object val1 = get();313c.v[0][0][0][0] = Values.B; Object val2 = get();314assertEquals(val1, Values.A);315assertEquals(val2, (isStableEnabled ? Values.A : Values.B));316317c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.C; Object val3 = get();318assertEquals(val3, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)319: Values.C));320321c.v[0] = new Object[1][1][1]; c.v[0][0][0][0] = Values.D; Object val4 = get();322assertEquals(val4, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)323: Values.D));324325c.v[0][0] = new Object[1][1]; c.v[0][0][0][0] = Values.E; Object val5 = get();326assertEquals(val5, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)327: Values.E));328329c.v[0][0][0] = new Object[1]; c.v[0][0][0][0] = Values.F; Object val6 = get();330assertEquals(val6, (isStableEnabled ? (isStableEnabled ? Values.A : Values.B)331: Values.F));332}333334{335c.v = new Object[1][1][1][1]; Object[] val1 = get1();336c.v[0][0][0] = new Object[1]; Object[] val2 = get1();337assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));338}339340{341c.v = new Object[1][1][1][1]; Object[][] val1 = get2();342c.v[0][0] = new Object[1][1]; Object[][] val2 = get2();343assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));344}345346{347c.v = new Object[1][1][1][1]; Object[][][] val1 = get3();348c.v[0] = new Object[1][1][1]; Object[][][] val2 = get3();349assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));350}351352{353c.v = new Object[1][1][1][1]; Object[][][][] val1 = get4();354c.v = new Object[1][1][1][1]; Object[][][][] val2 = get4();355assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));356}357}358}359360/* ==================================================== */361// Dynamic Dim is higher than static362static class ObjectArrayLowerDim0 {363public @Stable Object v;364365public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0();366public static Object get() { return ((Object[])c.v)[0]; }367public static Object[] get1() { return (Object[])c.v; }368369public static void test() throws Exception {370{371c.v = new Object[1]; ((Object[])c.v)[0] = Values.A; Object val1 = get();372((Object[])c.v)[0] = Values.B; Object val2 = get();373374assertEquals(val1, Values.A);375assertEquals(val2, Values.B);376}377378{379c.v = new Object[1]; Object[] val1 = get1();380c.v = new Object[1]; Object[] val2 = get1();381assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));382}383}384}385386/* ==================================================== */387388static class ObjectArrayLowerDim1 {389public @Stable Object[] v;390391public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1();392public static Object get() { return ((Object[][])c.v)[0][0]; }393public static Object[] get1() { return (Object[])(c.v[0]); }394public static Object[] get2() { return c.v; }395396public static void test() throws Exception {397{398c.v = new Object[1][1]; ((Object[][])c.v)[0][0] = Values.A; Object val1 = get();399((Object[][])c.v)[0][0] = Values.B; Object val2 = get();400401assertEquals(val1, Values.A);402assertEquals(val2, Values.B);403}404405{406c.v = new Object[1][1]; c.v[0] = new Object[0]; Object[] val1 = get1();407c.v[0] = new Object[0]; Object[] val2 = get1();408409assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));410}411412{413c.v = new Object[0][0]; Object[] val1 = get2();414c.v = new Object[0][0]; Object[] val2 = get2();415416assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));417}418}419}420421/* ==================================================== */422423static class ObjectArrayLowerDim2 {424public @Stable Object[][] v;425426public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2();427public static Object get() { return ((Object[][][])c.v)[0][0][0]; }428public static Object[] get1() { return (Object[])(c.v[0][0]); }429public static Object[][] get2() { return (Object[][])(c.v[0]); }430public static Object[][] get3() { return c.v; }431432public static void test() throws Exception {433{434c.v = new Object[1][1][1]; ((Object[][][])c.v)[0][0][0] = Values.A; Object val1 = get();435((Object[][][])c.v)[0][0][0] = Values.B; Object val2 = get();436437assertEquals(val1, Values.A);438assertEquals(val2, Values.B);439}440441{442c.v = new Object[1][1][1]; c.v[0][0] = new Object[0]; Object[] val1 = get1();443c.v[0][0] = new Object[0]; Object[] val2 = get1();444445assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));446}447448{449c.v = new Object[1][1][1]; c.v[0] = new Object[0][0]; Object[][] val1 = get2();450c.v[0] = new Object[0][0]; Object[][] val2 = get2();451452assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));453}454455{456c.v = new Object[0][0][0]; Object[][] val1 = get3();457c.v = new Object[0][0][0]; Object[][] val2 = get3();458459assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2)));460}461}462}463464/* ==================================================== */465466static class NestedStableField {467static class A {468public @Stable Object a;469470}471public @Stable A v;472473public static final NestedStableField c = new NestedStableField();474public static A get() { return c.v; }475public static Object get1() { return get().a; }476477public static void test() throws Exception {478{479c.v = new A(); c.v.a = Values.A; A val1 = get();480c.v.a = Values.B; A val2 = get();481482assertEquals(val1.a, Values.B);483assertEquals(val2.a, Values.B);484}485486{487c.v = new A(); c.v.a = Values.A; Object val1 = get1();488c.v.a = Values.B; Object val2 = get1();489c.v = new A(); c.v.a = Values.C; Object val3 = get1();490491assertEquals(val1, Values.A);492assertEquals(val2, (isStableEnabled ? Values.A : Values.B));493assertEquals(val3, (isStableEnabled ? Values.A : Values.C));494}495}496}497498/* ==================================================== */499500static class NestedStableField1 {501static class A {502public @Stable Object a;503public @Stable A next;504}505public @Stable A v;506507public static final NestedStableField1 c = new NestedStableField1();508public static A get() { return c.v.next.next.next.next.next.next.next; }509public static Object get1() { return get().a; }510511public static void test() throws Exception {512{513c.v = new A(); c.v.next = new A(); c.v.next.next = c.v;514c.v.a = Values.A; c.v.next.a = Values.A; A val1 = get();515c.v.a = Values.B; c.v.next.a = Values.B; A val2 = get();516517assertEquals(val1.a, Values.B);518assertEquals(val2.a, Values.B);519}520521{522c.v = new A(); c.v.next = c.v;523c.v.a = Values.A; Object val1 = get1();524c.v.a = Values.B; Object val2 = get1();525c.v = new A(); c.v.next = c.v;526c.v.a = Values.C; Object val3 = get1();527528assertEquals(val1, Values.A);529assertEquals(val2, (isStableEnabled ? Values.A : Values.B));530assertEquals(val3, (isStableEnabled ? Values.A : Values.C));531}532}533}534/* ==================================================== */535536static class NestedStableField2 {537static class A {538public @Stable Object a;539public @Stable A left;540public A right;541}542543public @Stable A v;544545public static final NestedStableField2 c = new NestedStableField2();546public static Object get() { return c.v.left.left.left.a; }547public static Object get1() { return c.v.left.left.right.left.a; }548549public static void test() throws Exception {550{551c.v = new A(); c.v.left = c.v.right = c.v;552c.v.a = Values.A; Object val1 = get(); Object val2 = get1();553c.v.a = Values.B; Object val3 = get(); Object val4 = get1();554555assertEquals(val1, Values.A);556assertEquals(val3, (isStableEnabled ? Values.A : Values.B));557558assertEquals(val2, Values.A);559assertEquals(val4, Values.B);560}561}562}563564/* ==================================================== */565566static class NestedStableField3 {567static class A {568public @Stable Object a;569public @Stable A[] left;570public A[] right;571}572573public @Stable A[] v;574575public static final NestedStableField3 c = new NestedStableField3();576public static Object get() { return c.v[0].left[1].left[0].left[1].a; }577public static Object get1() { return c.v[1].left[0].left[1].right[0].left[1].a; }578579public static void test() throws Exception {580{581A elem = new A();582c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v;583elem.a = Values.A; Object val1 = get(); Object val2 = get1();584elem.a = Values.B; Object val3 = get(); Object val4 = get1();585586assertEquals(val1, Values.A);587assertEquals(val3, (isStableEnabled ? Values.A : Values.B));588589assertEquals(val2, Values.A);590assertEquals(val4, Values.B);591}592}593}594595/* ==================================================== */596// Auxiliary methods597static void assertEquals(Object i, Object j) { if (i != j) throw new AssertionError(i + " != " + j); }598static void assertTrue(boolean b) { if (!b) throw new AssertionError(); }599600static boolean failed = false;601602public static void run(Class<?> test) {603Throwable ex = null;604System.out.print(test.getName()+": ");605try {606test.getMethod("test").invoke(null);607} catch (InvocationTargetException e) {608ex = e.getCause();609} catch (Throwable e) {610ex = e;611} finally {612if (ex == null) {613System.out.println("PASSED");614} else {615failed = true;616System.out.println("FAILED");617ex.printStackTrace(System.out);618}619}620}621}622623624