# HG changeset patch # User Tom Rodriguez # Date 1436401574 25200 # Node ID ffe1fd7ff6d7204a53b8ae6a2f32c5f8a3ee0b17 # Parent 911105865ffcff422a7081adbe59a26e55df720f LoadHub should be guarded by null check instead of range check diff -r 911105865ffc -r ffe1fd7ff6d7 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Wed Jul 08 17:09:20 2015 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Wed Jul 08 17:26:14 2015 -0700 @@ -211,7 +211,7 @@ Kind elementKind = loadIndexed.elementKind(); Stamp loadStamp = loadStamp(loadIndexed.stamp(), elementKind); - PiNode pi = getBoundsCheckedIndex(loadIndexed, tool); + PiNode pi = getBoundsCheckedIndex(loadIndexed, tool, null); ValueNode checkedIndex = pi; if (checkedIndex == null) { checkedIndex = loadIndexed.index(); @@ -232,7 +232,8 @@ protected void lowerStoreIndexedNode(StoreIndexedNode storeIndexed, LoweringTool tool) { StructuredGraph graph = storeIndexed.graph(); - PiNode pi = getBoundsCheckedIndex(storeIndexed, tool); + GuardingNode[] nullCheckReturn = new GuardingNode[1]; + PiNode pi = getBoundsCheckedIndex(storeIndexed, tool, nullCheckReturn); ValueNode checkedIndex; GuardingNode boundsCheck; if (pi == null) { @@ -263,7 +264,13 @@ value = storeCheck; } } else { - ValueNode arrayClass = createReadHub(graph, array, boundsCheck); + /* + * The guard on the read hub should be the null check of the array that was + * introduced earlier. + */ + GuardingNode nullCheck = nullCheckReturn[0]; + assert nullCheckReturn[0] != null || createNullCheck(array, storeIndexed, tool) == null; + ValueNode arrayClass = createReadHub(graph, array, nullCheck); ValueNode componentHub = createReadArrayComponentHub(graph, arrayClass, storeIndexed); checkCastNode = graph.add(new CheckCastDynamicNode(componentHub, value, true)); graph.addBeforeFixed(storeIndexed, checkCastNode); @@ -669,7 +676,7 @@ protected abstract ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor); - protected PiNode getBoundsCheckedIndex(AccessIndexedNode n, LoweringTool tool) { + protected PiNode getBoundsCheckedIndex(AccessIndexedNode n, LoweringTool tool, GuardingNode[] nullCheckReturn) { StructuredGraph graph = n.graph(); ValueNode array = n.array(); ValueNode arrayLength = readArrayLength(array, tool.getConstantReflection()); @@ -678,7 +685,11 @@ AddressNode address = createOffsetAddress(graph, array, arrayLengthOffset()); ReadNode readArrayLength = graph.add(new ReadNode(address, ARRAY_LENGTH_LOCATION, stamp, BarrierType.NONE)); graph.addBeforeFixed(n, readArrayLength); - readArrayLength.setGuard(createNullCheck(array, readArrayLength, tool)); + GuardingNode nullCheck = createNullCheck(array, readArrayLength, tool); + if (nullCheckReturn != null) { + nullCheckReturn[0] = nullCheck; + } + readArrayLength.setGuard(nullCheck); arrayLength = readArrayLength; } else { arrayLength = arrayLength.isAlive() ? arrayLength : graph.addOrUniqueWithInputs(arrayLength);