-
Enhancement
-
Resolution: Fixed
-
P4
-
repo-valhalla
TestLWorld.test38 currently fails due to this issue.
In C1, Phi nodes are created when merging two paths of execution. In the following code, a Phi node is created to merge the two switch cases. An asstore instruction is then used to store into this node.
Sometimes when a Phi node is created, the exact type of the node cannot be determined. (E.g., the same local slot can be assigned different types in the two paths). Therefore, for type safety, in the current implementation, a Phi node is assigned to have no type (except for the very narrow case ofJDK-8214742). See
http://hg.openjdk.java.net/valhalla/valhalla/file/9d12c8ada27d/src/hotspot/share/c1/c1_ValueStack.cpp#l186
Hence, when aastore is used on a Phi node with no type info, it's possible for the targeted array to be flattened, and C1 must emit a check for flatness.
public class CovStore3 {
static final value class V {
final int v0 = 0, v1 = 0;
static V make(int n) {
V v = V.default;
v = __WithField(v.v0, 1234 + n);
v = __WithField(v.v1, 5678 + n);
return v;
}
}
static public Object[] test38_inline() {
return new V[42];
}
static public Object[] test(Object[] oa, Object o, int i1, int i2, int num) {
Object[] result = null;
switch (num) {
case 0:
result = test38_inline();
break;
case 1:
result = oa;
}
result[i2] = o; // <<< aastore into a Phi node
return result;
}
public static void main(String args[]) {
V v = V.make(1);
V[] arr = new V[2];
Object[] o = test(null, v, 0, 0, 0);
System.out.println("Hello: " + o[0]); // v.v0 should be 1234
}
}
In C1, Phi nodes are created when merging two paths of execution. In the following code, a Phi node is created to merge the two switch cases. An asstore instruction is then used to store into this node.
Sometimes when a Phi node is created, the exact type of the node cannot be determined. (E.g., the same local slot can be assigned different types in the two paths). Therefore, for type safety, in the current implementation, a Phi node is assigned to have no type (except for the very narrow case of
http://hg.openjdk.java.net/valhalla/valhalla/file/9d12c8ada27d/src/hotspot/share/c1/c1_ValueStack.cpp#l186
Hence, when aastore is used on a Phi node with no type info, it's possible for the targeted array to be flattened, and C1 must emit a check for flatness.
public class CovStore3 {
static final value class V {
final int v0 = 0, v1 = 0;
static V make(int n) {
V v = V.default;
v = __WithField(v.v0, 1234 + n);
v = __WithField(v.v1, 5678 + n);
return v;
}
}
static public Object[] test38_inline() {
return new V[42];
}
static public Object[] test(Object[] oa, Object o, int i1, int i2, int num) {
Object[] result = null;
switch (num) {
case 0:
result = test38_inline();
break;
case 1:
result = oa;
}
result[i2] = o; // <<< aastore into a Phi node
return result;
}
public static void main(String args[]) {
V v = V.make(1);
V[] arr = new V[2];
Object[] o = test(null, v, 0, 0, 0);
System.out.println("Hello: " + o[0]); // v.v0 should be 1234
}
}