comparison test/compiler/stable/TestStableBoolean.java @ 20199:5fbeae2a02d3

8043546: C1 optimizes @Stable instance fields with default values Reviewed-by: kvn, jrose
author vlivanov
date Thu, 10 Jul 2014 12:04:43 -0700
parents 248ff38d2950
children
comparison
equal deleted inserted replaced
20198:c49dcaf78a65 20199:5fbeae2a02d3
24 */ 24 */
25 25
26 /* 26 /*
27 * @test TestStableBoolean 27 * @test TestStableBoolean
28 * @summary tests on stable fields and arrays 28 * @summary tests on stable fields and arrays
29 * @library /testlibrary 29 * @library /testlibrary /testlibrary/whitebox
30 * @compile -XDignore.symbol.file TestStableBoolean.java 30 * @build TestStableBoolean StableConfiguration sun.hotspot.WhiteBox
31 * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
31 * @run main ClassFileInstaller 32 * @run main ClassFileInstaller
33 * java/lang/invoke/StableConfiguration
32 * java/lang/invoke/TestStableBoolean 34 * java/lang/invoke/TestStableBoolean
33 * java/lang/invoke/TestStableBoolean$BooleanStable 35 * java/lang/invoke/TestStableBoolean$BooleanStable
34 * java/lang/invoke/TestStableBoolean$StaticBooleanStable 36 * java/lang/invoke/TestStableBoolean$StaticBooleanStable
35 * java/lang/invoke/TestStableBoolean$VolatileBooleanStable 37 * java/lang/invoke/TestStableBoolean$VolatileBooleanStable
36 * java/lang/invoke/TestStableBoolean$BooleanArrayDim1 38 * java/lang/invoke/TestStableBoolean$BooleanArrayDim1
46 * java/lang/invoke/TestStableBoolean$NestedStableField2 48 * java/lang/invoke/TestStableBoolean$NestedStableField2
47 * java/lang/invoke/TestStableBoolean$NestedStableField2$A 49 * java/lang/invoke/TestStableBoolean$NestedStableField2$A
48 * java/lang/invoke/TestStableBoolean$NestedStableField3 50 * java/lang/invoke/TestStableBoolean$NestedStableField3
49 * java/lang/invoke/TestStableBoolean$NestedStableField3$A 51 * java/lang/invoke/TestStableBoolean$NestedStableField3$A
50 * java/lang/invoke/TestStableBoolean$DefaultValue 52 * java/lang/invoke/TestStableBoolean$DefaultValue
53 * java/lang/invoke/TestStableBoolean$DefaultStaticValue
51 * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim2 54 * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim2
52 * 55 *
53 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions 56 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
54 * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:+UseCompressedOop 57 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
55 * -server -XX:-TieredCompilation -Xcomp 58 * -server -XX:-TieredCompilation
59 * -XX:+FoldStableValues
60 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
61 * java.lang.invoke.TestStableBoolean
62 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
63 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
64 * -server -XX:-TieredCompilation
65 * -XX:-FoldStableValues
56 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 66 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
57 * java.lang.invoke.TestStableBoolean 67 * java.lang.invoke.TestStableBoolean
58 * 68 *
59 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions 69 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
60 * -XX:+UnlockDiagnosticVMOptions -XX:+FoldStableValues -XX:-UseCompressedOop 70 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
61 * -server -XX:-TieredCompilation -Xcomp 71 * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
72 * -XX:+FoldStableValues
73 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
74 * java.lang.invoke.TestStableBoolean
75 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
76 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
77 * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1
78 * -XX:-FoldStableValues
62 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 79 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
63 * java.lang.invoke.TestStableBoolean 80 * java.lang.invoke.TestStableBoolean
64 * 81 *
65 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions 82 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
66 * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:+UseCompressedOop 83 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
67 * -server -XX:-TieredCompilation -Xcomp 84 * -client -XX:-TieredCompilation
85 * -XX:+FoldStableValues
68 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 86 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
69 * java.lang.invoke.TestStableBoolean 87 * java.lang.invoke.TestStableBoolean
70 *
71 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions 88 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
72 * -XX:+UnlockDiagnosticVMOptions -XX:-FoldStableValues -XX:-UseCompressedOop 89 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
73 * -server -XX:-TieredCompilation -Xcomp 90 * -client -XX:-TieredCompilation
91 * -XX:-FoldStableValues
74 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 92 * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
75 * java.lang.invoke.TestStableBoolean 93 * java.lang.invoke.TestStableBoolean
76 */ 94 */
77 package java.lang.invoke; 95 package java.lang.invoke;
78 96
79 import com.sun.management.HotSpotDiagnosticMXBean;
80 import com.sun.management.VMOption;
81 import sun.management.ManagementFactoryHelper;
82 import java.lang.reflect.InvocationTargetException; 97 import java.lang.reflect.InvocationTargetException;
83 98
84 public class TestStableBoolean { 99 public class TestStableBoolean {
100 static final boolean isStableEnabled = StableConfiguration.isStableEnabled;
101 static final boolean isServerWithStable = StableConfiguration.isServerWithStable;
102
85 public static void main(String[] args) throws Exception { 103 public static void main(String[] args) throws Exception {
86 System.out.println("@Stable enabled: "+isStableEnabled);
87 System.out.println();
88
89 run(DefaultValue.class); 104 run(DefaultValue.class);
90 run(BooleanStable.class); 105 run(BooleanStable.class);
106 run(DefaultStaticValue.class);
91 run(StaticBooleanStable.class); 107 run(StaticBooleanStable.class);
92 run(VolatileBooleanStable.class); 108 run(VolatileBooleanStable.class);
93 109
94 // @Stable arrays: Dim 1-4 110 // @Stable arrays: Dim 1-4
95 run(BooleanArrayDim1.class); 111 run(BooleanArrayDim1.class);
143 } 159 }
144 } 160 }
145 161
146 /* ==================================================== */ 162 /* ==================================================== */
147 163
164 static class DefaultStaticValue {
165 public static @Stable boolean v;
166
167 public static final DefaultStaticValue c = new DefaultStaticValue();
168 public static boolean get() { return c.v; }
169 public static void test() throws Exception {
170 boolean val1 = get();
171 c.v = true; boolean val2 = get();
172 assertEquals(val1, false);
173 assertEquals(val2, true);
174 }
175 }
176
177 /* ==================================================== */
178
148 static class StaticBooleanStable { 179 static class StaticBooleanStable {
149 public static @Stable boolean v; 180 public static @Stable boolean v;
150 181
151 public static final StaticBooleanStable c = new StaticBooleanStable(); 182 public static final StaticBooleanStable c = new StaticBooleanStable();
152 public static boolean get() { return c.v; } 183 public static boolean get() { return c.v; }
186 public static void test() throws Exception { 217 public static void test() throws Exception {
187 { 218 {
188 c.v = new boolean[1]; c.v[0] = true; boolean val1 = get(); 219 c.v = new boolean[1]; c.v[0] = true; boolean val1 = get();
189 c.v[0] = false; boolean val2 = get(); 220 c.v[0] = false; boolean val2 = get();
190 assertEquals(val1, true); 221 assertEquals(val1, true);
191 assertEquals(val2, (isStableEnabled ? true : false)); 222 assertEquals(val2, (isServerWithStable ? true : false));
192 } 223 }
193 224
194 { 225 {
195 c.v = new boolean[20]; c.v[10] = true; boolean val1 = get1(); 226 c.v = new boolean[20]; c.v[10] = true; boolean val1 = get1();
196 c.v[10] = false; boolean val2 = get1(); 227 c.v[10] = false; boolean val2 = get1();
197 assertEquals(val1, true); 228 assertEquals(val1, true);
198 assertEquals(val2, (isStableEnabled ? true : false)); 229 assertEquals(val2, (isServerWithStable ? true : false));
199 } 230 }
200 231
201 { 232 {
202 c.v = new boolean[1]; boolean[] val1 = get2(); 233 c.v = new boolean[1]; boolean[] val1 = get2();
203 c.v = new boolean[1]; boolean[] val2 = get2(); 234 c.v = new boolean[1]; boolean[] val2 = get2();
218 public static void test() throws Exception { 249 public static void test() throws Exception {
219 { 250 {
220 c.v = new boolean[1][1]; c.v[0][0] = true; boolean val1 = get(); 251 c.v = new boolean[1][1]; c.v[0][0] = true; boolean val1 = get();
221 c.v[0][0] = false; boolean val2 = get(); 252 c.v[0][0] = false; boolean val2 = get();
222 assertEquals(val1, true); 253 assertEquals(val1, true);
223 assertEquals(val2, (isStableEnabled ? true : false)); 254 assertEquals(val2, (isServerWithStable ? true : false));
224 255
225 c.v = new boolean[1][1]; c.v[0][0] = false; boolean val3 = get(); 256 c.v = new boolean[1][1]; c.v[0][0] = false; boolean val3 = get();
226 assertEquals(val3, (isStableEnabled ? true : false)); 257 assertEquals(val3, (isServerWithStable ? true : false));
227 258
228 c.v[0] = new boolean[1]; c.v[0][0] = false; boolean val4 = get(); 259 c.v[0] = new boolean[1]; c.v[0][0] = false; boolean val4 = get();
229 assertEquals(val4, (isStableEnabled ? true : false)); 260 assertEquals(val4, (isServerWithStable ? true : false));
230 } 261 }
231 262
232 { 263 {
233 c.v = new boolean[1][1]; boolean[] val1 = get1(); 264 c.v = new boolean[1][1]; boolean[] val1 = get1();
234 c.v[0] = new boolean[1]; boolean[] val2 = get1(); 265 c.v[0] = new boolean[1]; boolean[] val2 = get1();
235 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 266 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
236 } 267 }
237 268
238 { 269 {
239 c.v = new boolean[1][1]; boolean[][] val1 = get2(); 270 c.v = new boolean[1][1]; boolean[][] val1 = get2();
240 c.v = new boolean[1][1]; boolean[][] val2 = get2(); 271 c.v = new boolean[1][1]; boolean[][] val2 = get2();
256 public static void test() throws Exception { 287 public static void test() throws Exception {
257 { 288 {
258 c.v = new boolean[1][1][1]; c.v[0][0][0] = true; boolean val1 = get(); 289 c.v = new boolean[1][1][1]; c.v[0][0][0] = true; boolean val1 = get();
259 c.v[0][0][0] = false; boolean val2 = get(); 290 c.v[0][0][0] = false; boolean val2 = get();
260 assertEquals(val1, true); 291 assertEquals(val1, true);
261 assertEquals(val2, (isStableEnabled ? true : false)); 292 assertEquals(val2, (isServerWithStable ? true : false));
262 293
263 c.v = new boolean[1][1][1]; c.v[0][0][0] = false; boolean val3 = get(); 294 c.v = new boolean[1][1][1]; c.v[0][0][0] = false; boolean val3 = get();
264 assertEquals(val3, (isStableEnabled ? true : false)); 295 assertEquals(val3, (isServerWithStable ? true : false));
265 296
266 c.v[0] = new boolean[1][1]; c.v[0][0][0] = false; boolean val4 = get(); 297 c.v[0] = new boolean[1][1]; c.v[0][0][0] = false; boolean val4 = get();
267 assertEquals(val4, (isStableEnabled ? true : false)); 298 assertEquals(val4, (isServerWithStable ? true : false));
268 299
269 c.v[0][0] = new boolean[1]; c.v[0][0][0] = false; boolean val5 = get(); 300 c.v[0][0] = new boolean[1]; c.v[0][0][0] = false; boolean val5 = get();
270 assertEquals(val5, (isStableEnabled ? true : false)); 301 assertEquals(val5, (isServerWithStable ? true : false));
271 } 302 }
272 303
273 { 304 {
274 c.v = new boolean[1][1][1]; boolean[] val1 = get1(); 305 c.v = new boolean[1][1][1]; boolean[] val1 = get1();
275 c.v[0][0] = new boolean[1]; boolean[] val2 = get1(); 306 c.v[0][0] = new boolean[1]; boolean[] val2 = get1();
276 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 307 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
277 } 308 }
278 309
279 { 310 {
280 c.v = new boolean[1][1][1]; boolean[][] val1 = get2(); 311 c.v = new boolean[1][1][1]; boolean[][] val1 = get2();
281 c.v[0] = new boolean[1][1]; boolean[][] val2 = get2(); 312 c.v[0] = new boolean[1][1]; boolean[][] val2 = get2();
282 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 313 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
283 } 314 }
284 315
285 { 316 {
286 c.v = new boolean[1][1][1]; boolean[][][] val1 = get3(); 317 c.v = new boolean[1][1][1]; boolean[][][] val1 = get3();
287 c.v = new boolean[1][1][1]; boolean[][][] val2 = get3(); 318 c.v = new boolean[1][1][1]; boolean[][][] val2 = get3();
304 public static void test() throws Exception { 335 public static void test() throws Exception {
305 { 336 {
306 c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = true; boolean val1 = get(); 337 c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = true; boolean val1 = get();
307 c.v[0][0][0][0] = false; boolean val2 = get(); 338 c.v[0][0][0][0] = false; boolean val2 = get();
308 assertEquals(val1, true); 339 assertEquals(val1, true);
309 assertEquals(val2, (isStableEnabled ? true : false)); 340 assertEquals(val2, (isServerWithStable ? true : false));
310 341
311 c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = false; boolean val3 = get(); 342 c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = false; boolean val3 = get();
312 assertEquals(val3, (isStableEnabled ? true : false)); 343 assertEquals(val3, (isServerWithStable ? true : false));
313 344
314 c.v[0] = new boolean[1][1][1]; c.v[0][0][0][0] = false; boolean val4 = get(); 345 c.v[0] = new boolean[1][1][1]; c.v[0][0][0][0] = false; boolean val4 = get();
315 assertEquals(val4, (isStableEnabled ? true : false)); 346 assertEquals(val4, (isServerWithStable ? true : false));
316 347
317 c.v[0][0] = new boolean[1][1]; c.v[0][0][0][0] = false; boolean val5 = get(); 348 c.v[0][0] = new boolean[1][1]; c.v[0][0][0][0] = false; boolean val5 = get();
318 assertEquals(val5, (isStableEnabled ? true : false)); 349 assertEquals(val5, (isServerWithStable ? true : false));
319 350
320 c.v[0][0][0] = new boolean[1]; c.v[0][0][0][0] = false; boolean val6 = get(); 351 c.v[0][0][0] = new boolean[1]; c.v[0][0][0][0] = false; boolean val6 = get();
321 assertEquals(val6, (isStableEnabled ? true : false)); 352 assertEquals(val6, (isServerWithStable ? true : false));
322 } 353 }
323 354
324 { 355 {
325 c.v = new boolean[1][1][1][1]; boolean[] val1 = get1(); 356 c.v = new boolean[1][1][1][1]; boolean[] val1 = get1();
326 c.v[0][0][0] = new boolean[1]; boolean[] val2 = get1(); 357 c.v[0][0][0] = new boolean[1]; boolean[] val2 = get1();
327 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 358 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
328 } 359 }
329 360
330 { 361 {
331 c.v = new boolean[1][1][1][1]; boolean[][] val1 = get2(); 362 c.v = new boolean[1][1][1][1]; boolean[][] val1 = get2();
332 c.v[0][0] = new boolean[1][1]; boolean[][] val2 = get2(); 363 c.v[0][0] = new boolean[1][1]; boolean[][] val2 = get2();
333 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 364 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
334 } 365 }
335 366
336 { 367 {
337 c.v = new boolean[1][1][1][1]; boolean[][][] val1 = get3(); 368 c.v = new boolean[1][1][1][1]; boolean[][][] val1 = get3();
338 c.v[0] = new boolean[1][1][1]; boolean[][][] val2 = get3(); 369 c.v[0] = new boolean[1][1][1]; boolean[][][] val2 = get3();
339 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 370 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
340 } 371 }
341 372
342 { 373 {
343 c.v = new boolean[1][1][1][1]; boolean[][][][] val1 = get4(); 374 c.v = new boolean[1][1][1][1]; boolean[][][][] val1 = get4();
344 c.v = new boolean[1][1][1][1]; boolean[][][][] val2 = get4(); 375 c.v = new boolean[1][1][1][1]; boolean[][][][] val2 = get4();
397 428
398 { 429 {
399 c.v = new boolean[1][1]; c.v[0] = new boolean[0]; boolean[] val1 = get1(); 430 c.v = new boolean[1][1]; c.v[0] = new boolean[0]; boolean[] val1 = get1();
400 c.v[0] = new boolean[0]; boolean[] val2 = get1(); 431 c.v[0] = new boolean[0]; boolean[] val2 = get1();
401 432
402 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 433 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
403 } 434 }
404 435
405 { 436 {
406 c.v = new boolean[0][0]; Object[] val1 = get2(); 437 c.v = new boolean[0][0]; Object[] val1 = get2();
407 c.v = new boolean[0][0]; Object[] val2 = get2(); 438 c.v = new boolean[0][0]; Object[] val2 = get2();
433 464
434 { 465 {
435 c.v = new boolean[1][1][1]; c.v[0][0] = new boolean[0]; boolean[] val1 = get1(); 466 c.v = new boolean[1][1][1]; c.v[0][0] = new boolean[0]; boolean[] val1 = get1();
436 c.v[0][0] = new boolean[0]; boolean[] val2 = get1(); 467 c.v[0][0] = new boolean[0]; boolean[] val2 = get1();
437 468
438 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 469 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
439 } 470 }
440 471
441 { 472 {
442 c.v = new boolean[1][1][1]; c.v[0] = new boolean[0][0]; boolean[][] val1 = get2(); 473 c.v = new boolean[1][1][1]; c.v[0] = new boolean[0][0]; boolean[][] val1 = get2();
443 c.v[0] = new boolean[0][0]; boolean[][] val2 = get2(); 474 c.v[0] = new boolean[0][0]; boolean[][] val2 = get2();
444 475
445 assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); 476 assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2)));
446 } 477 }
447 478
448 { 479 {
449 c.v = new boolean[0][0][0]; Object[][] val1 = get3(); 480 c.v = new boolean[0][0][0]; Object[][] val1 = get3();
450 c.v = new boolean[0][0][0]; Object[][] val2 = get3(); 481 c.v = new boolean[0][0][0]; Object[][] val2 = get3();
575 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; 606 c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v;
576 elem.a = true; boolean val1 = get(); boolean val2 = get1(); 607 elem.a = true; boolean val1 = get(); boolean val2 = get1();
577 elem.a = false; boolean val3 = get(); boolean val4 = get1(); 608 elem.a = false; boolean val3 = get(); boolean val4 = get1();
578 609
579 assertEquals(val1, true); 610 assertEquals(val1, true);
580 assertEquals(val3, (isStableEnabled ? true : false)); 611 assertEquals(val3, (isServerWithStable ? true : false));
581 612
582 assertEquals(val2, true); 613 assertEquals(val2, true);
583 assertEquals(val4, false); 614 assertEquals(val4, false);
584 } 615 }
585 } 616 }
609 System.out.println("FAILED"); 640 System.out.println("FAILED");
610 ex.printStackTrace(System.out); 641 ex.printStackTrace(System.out);
611 } 642 }
612 } 643 }
613 } 644 }
614
615 static final boolean isStableEnabled;
616 static {
617 HotSpotDiagnosticMXBean diagnostic
618 = ManagementFactoryHelper.getDiagnosticMXBean();
619 VMOption tmp;
620 try {
621 tmp = diagnostic.getVMOption("FoldStableValues");
622 } catch (IllegalArgumentException e) {
623 tmp = null;
624 }
625 isStableEnabled = (tmp == null ? false : Boolean.parseBoolean(tmp.getValue()));
626 }
627 } 645 }