changeset 22190:ffe1fd7ff6d7

LoadHub should be guarded by null check instead of range check
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Wed, 08 Jul 2015 17:26:14 -0700
parents 911105865ffc
children 3c32af2369d2
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java
diffstat 1 files changed, 16 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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);