23
23
24
24
/**
25
25
* @test
26
- * @bug 8237007
26
+ * @bug 8237007 8260637
27
27
* @summary Shenandoah: assert(_base == Tuple) failure during C2 compilation
28
28
* @requires vm.flavor == "server"
29
29
* @requires vm.gc.Shenandoah
33
33
*/
34
34
35
35
public class LRBRightAfterMemBar {
36
- private static Object field1 ;
36
+ private static A field1 ;
37
37
private static Object field2 ;
38
38
static volatile int barrier ;
39
39
40
40
public static void main (String [] args ) {
41
41
for (int i = 0 ; i < 20_000 ; i ++) {
42
- test (true , true , new Object ());
43
- test (false , false , new Object ());
42
+ test1 (true , true , new Object ());
43
+ test1 (false , false , new Object ());
44
+ test2 (new Object (), 0 , 10 );
44
45
}
45
46
}
46
47
47
- private static Object test (boolean flag , boolean flag2 , Object o2 ) {
48
+ private static Object test1 (boolean flag , boolean flag2 , Object o2 ) {
48
49
for (int i = 0 ; i < 10 ; i ++) {
49
50
barrier = 0x42 ; // Membar
50
51
if (o2 == null ) { // hoisted out of loop
@@ -61,4 +62,30 @@ private static Object test(boolean flag, boolean flag2, Object o2) {
61
62
62
63
return null ;
63
64
}
65
+
66
+ private static int test2 (Object o2 , int start , int stop ) {
67
+ A a1 = null ;
68
+ A a2 = null ;
69
+ int v = 0 ;
70
+ for (int i = start ; i < stop ; i ++) {
71
+ a2 = new A ();
72
+ a1 = new A ();
73
+ a1 .a = a2 ;
74
+ barrier = 0x42 ; // Membar
75
+ if (o2 == null ) { // hoisted out of loop
76
+ }
77
+ A a3 = a1 .a ;
78
+ v = a3 .f ; // null check optimized out by EA but CastPP left in
79
+ }
80
+
81
+ a1 .f = 0x42 ;
82
+ a2 .f = 0x42 ;
83
+
84
+ return v ;
85
+ }
86
+
87
+ static class A {
88
+ A a ;
89
+ int f ;
90
+ }
64
91
}
0 commit comments