--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java Thu Nov 15 21:05:47 2018 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java Thu Nov 15 09:04:07 2018 -0800
@@ -188,17 +188,19 @@
JavaKind accessKind = load.accessKind();
JavaKind componentKind = type.getComponentType().getJavaKind();
long offset = load.offset().asJavaConstant().asLong();
- int index = VirtualArrayNode.entryIndexForOffset(tool.getArrayOffsetProvider(), offset, accessKind, type.getComponentType(), Integer.MAX_VALUE);
- ValueNode object = GraphUtil.unproxify(load.object());
- LocationIdentity location = NamedLocationIdentity.getArrayLocation(componentKind);
- ValueNode cachedValue = state.getReadCache(object, location, index, accessKind, this);
- assert cachedValue == null || load.stamp(NodeView.DEFAULT).isCompatible(cachedValue.stamp(NodeView.DEFAULT)) : "The RawLoadNode's stamp is not compatible with the cached value.";
- if (cachedValue != null) {
- effects.replaceAtUsages(load, cachedValue, load);
- addScalarAlias(load, cachedValue);
- return true;
- } else {
- state.addReadCache(object, location, index, accessKind, isOverflowAccess(accessKind, componentKind), load, this);
+ int index = VirtualArrayNode.entryIndexForOffset(tool.getMetaAccess(), offset, accessKind, type.getComponentType(), Integer.MAX_VALUE);
+ if (index >= 0) {
+ ValueNode object = GraphUtil.unproxify(load.object());
+ LocationIdentity location = NamedLocationIdentity.getArrayLocation(componentKind);
+ ValueNode cachedValue = state.getReadCache(object, location, index, accessKind, this);
+ assert cachedValue == null || load.stamp(NodeView.DEFAULT).isCompatible(cachedValue.stamp(NodeView.DEFAULT)) : "The RawLoadNode's stamp is not compatible with the cached value.";
+ if (cachedValue != null) {
+ effects.replaceAtUsages(load, cachedValue, load);
+ addScalarAlias(load, cachedValue);
+ return true;
+ } else {
+ state.addReadCache(object, location, index, accessKind, isOverflowAccess(accessKind, componentKind), load, this);
+ }
}
}
}
@@ -214,7 +216,7 @@
if (store.offset().isConstant()) {
long offset = store.offset().asJavaConstant().asLong();
boolean overflowAccess = isOverflowAccess(accessKind, componentKind);
- int index = overflowAccess ? -1 : VirtualArrayNode.entryIndexForOffset(tool.getArrayOffsetProvider(), offset, accessKind, type.getComponentType(), Integer.MAX_VALUE);
+ int index = overflowAccess ? -1 : VirtualArrayNode.entryIndexForOffset(tool.getMetaAccess(), offset, accessKind, type.getComponentType(), Integer.MAX_VALUE);
return processStore(store, store.object(), location, index, accessKind, overflowAccess, store.value(), state, effects);
} else {
processIdentity(state, location);