changeset 22531:ce2b71115ade

Invert logic for recording the assumptions of an AssumptionResult to Assumptions; this allows using assumption-free AssumptionResults when compiling without speculative optimizations
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 28 Aug 2015 11:23:08 -0700
parents 3f620444d73f
children 6ba6a4aef241 f3ebbebef617
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeCheckHints.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GetClassNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeCheckNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AssumptionInlineInfo.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MethodHandleNode.java
diffstat 13 files changed, 70 insertions(+), 79 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java	Fri Aug 28 11:23:08 2015 -0700
@@ -964,9 +964,10 @@
                 if (type != null && type.isArray()) {
                     ResolvedJavaType element = type.getComponentType();
                     if (element != null && !element.isPrimitive() && !element.getElementalType().isInterface()) {
+                        Assumptions assumptions = object.graph().getAssumptions();
                         AssumptionResult<ResolvedJavaType> leafType = element.findLeafConcreteSubtype();
-                        if (leafType != null) {
-                            object.graph().getAssumptions().record(leafType);
+                        if (leafType != null && leafType.canRecordTo(assumptions)) {
+                            leafType.recordTo(assumptions);
                             return ConstantNode.forConstant(read.stamp(), leafType.getResult().getObjectHub(), tool.getMetaAccess());
                         }
                     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeCheckHints.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeCheckHints.java	Fri Aug 28 11:23:08 2015 -0700
@@ -96,14 +96,10 @@
         if (targetType != null && targetType.isLeaf()) {
             exact = targetType;
         } else {
-            if (assumptions != null) {
-                AssumptionResult<ResolvedJavaType> leafConcreteSubtype = targetType == null ? null : targetType.findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
-                    assumptions.record(leafConcreteSubtype);
-                    exact = leafConcreteSubtype.getResult();
-                } else {
-                    exact = null;
-                }
+            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = targetType == null ? null : targetType.findLeafConcreteSubtype();
+            if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                leafConcreteSubtype.recordTo(assumptions);
+                exact = leafConcreteSubtype.getResult();
             } else {
                 exact = null;
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GetClassNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/GetClassNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -65,11 +65,12 @@
             ResolvedJavaType exactType = null;
             if (objectStamp.isExactType()) {
                 exactType = objectStamp.type();
-            } else if (objectStamp.type() != null && object.graph().getAssumptions() != null) {
+            } else if (objectStamp.type() != null) {
+                Assumptions assumptions = object.graph().getAssumptions();
                 AssumptionResult<ResolvedJavaType> leafConcreteSubtype = objectStamp.type().findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
+                if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                    leafConcreteSubtype.recordTo(assumptions);
                     exactType = leafConcreteSubtype.getResult();
-                    object.graph().getAssumptions().record(leafConcreteSubtype);
                 }
             }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -103,11 +103,12 @@
             ObjectStamp objectStamp = (ObjectStamp) curValue.stamp();
             if (objectStamp.isExactType()) {
                 exactType = objectStamp.type();
-            } else if (objectStamp.type() != null && graph != null && graph.getAssumptions() != null) {
+            } else if (objectStamp.type() != null && graph != null) {
+                Assumptions assumptions = graph.getAssumptions();
                 AssumptionResult<ResolvedJavaType> leafConcreteSubtype = objectStamp.type().findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
+                if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                    leafConcreteSubtype.recordTo(assumptions);
                     exactType = leafConcreteSubtype.getResult();
-                    graph.getAssumptions().record(leafConcreteSubtype);
                 }
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -74,11 +74,11 @@
             if (StampTool.isExactType(object)) {
                 return resolveExactMethod(tool, type);
             }
-            Assumptions assumptions = graph().getAssumptions();
-            if (type != null && assumptions != null) {
+            if (type != null) {
+                Assumptions assumptions = graph().getAssumptions();
                 AssumptionResult<ResolvedJavaMethod> resolvedMethod = type.findUniqueConcreteMethod(method);
-                if (resolvedMethod != null && !type.isInterface() && method.getDeclaringClass().isAssignableFrom(type)) {
-                    assumptions.record(resolvedMethod);
+                if (resolvedMethod != null && resolvedMethod.canRecordTo(assumptions) && !type.isInterface() && method.getDeclaringClass().isAssignableFrom(type)) {
+                    resolvedMethod.recordTo(assumptions);
                     return ConstantNode.forConstant(stamp(), resolvedMethod.getResult().getEncoding(), tool.getMetaAccess());
                 }
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -76,12 +76,10 @@
             return synonym;
         }
         assert object.stamp() instanceof ObjectStamp : object;
-        if (assumptions != null) {
-            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
-            if (leafConcreteSubtype != null && !leafConcreteSubtype.getResult().equals(type)) {
-                assumptions.record(leafConcreteSubtype);
-                type = leafConcreteSubtype.getResult();
-            }
+        AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
+        if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions) && !leafConcreteSubtype.getResult().equals(type)) {
+            leafConcreteSubtype.recordTo(assumptions);
+            type = leafConcreteSubtype.getResult();
         }
         return new CheckCastNode(type, object, profile, forStoreCheck);
     }
@@ -180,14 +178,13 @@
             return synonym;
         }
 
+        AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
         Assumptions assumptions = graph().getAssumptions();
-        if (assumptions != null) {
-            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
-            if (leafConcreteSubtype != null && !leafConcreteSubtype.getResult().equals(type)) {
-                // Propagate more precise type information to usages of the checkcast.
-                assumptions.record(leafConcreteSubtype);
-                return new CheckCastNode(leafConcreteSubtype.getResult(), object, profile, forStoreCheck);
-            }
+        if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions) && !leafConcreteSubtype.getResult().equals(type)) {
+            // Propagate more precise type information to usages of the checkcast.
+            leafConcreteSubtype.recordTo(assumptions);
+            CheckCastNode result = new CheckCastNode(leafConcreteSubtype.getResult(), object, profile, forStoreCheck);
+            return result;
         }
 
         return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -85,15 +85,14 @@
             if (result != null) {
                 return result;
             }
+
             Assumptions assumptions = graph() == null ? null : graph().getAssumptions();
-            if (assumptions != null) {
-                AssumptionResult<ResolvedJavaType> leafConcreteSubtype = stampType.findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
-                    result = checkInstanceOf(forValue, leafConcreteSubtype.getResult(), objectStamp.nonNull(), true);
-                    if (result != null) {
-                        assumptions.record(leafConcreteSubtype);
-                        return result;
-                    }
+            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = stampType.findLeafConcreteSubtype();
+            if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                result = checkInstanceOf(forValue, leafConcreteSubtype.getResult(), objectStamp.nonNull(), true);
+                if (result != null) {
+                    leafConcreteSubtype.recordTo(assumptions);
+                    return result;
                 }
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -129,22 +129,21 @@
             if (resolvedMethod != null && (resolvedMethod.canBeStaticallyBound() || StampTool.isExactType(receiver) || type.isArray())) {
                 return resolvedMethod;
             }
+
             Assumptions assumptions = receiver.graph().getAssumptions();
-            if (assumptions != null) {
-                AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
-                    ResolvedJavaMethod methodFromUniqueType = leafConcreteSubtype.getResult().resolveConcreteMethod(targetMethod, contextType);
-                    if (methodFromUniqueType != null) {
-                        assumptions.record(leafConcreteSubtype);
-                        return methodFromUniqueType;
-                    }
+            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = type.findLeafConcreteSubtype();
+            if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                ResolvedJavaMethod methodFromUniqueType = leafConcreteSubtype.getResult().resolveConcreteMethod(targetMethod, contextType);
+                if (methodFromUniqueType != null) {
+                    leafConcreteSubtype.recordTo(assumptions);
+                    return methodFromUniqueType;
                 }
+            }
 
-                AssumptionResult<ResolvedJavaMethod> uniqueConcreteMethod = type.findUniqueConcreteMethod(targetMethod);
-                if (uniqueConcreteMethod != null) {
-                    assumptions.record(uniqueConcreteMethod);
-                    return uniqueConcreteMethod.getResult();
-                }
+            AssumptionResult<ResolvedJavaMethod> uniqueConcreteMethod = type.findUniqueConcreteMethod(targetMethod);
+            if (uniqueConcreteMethod != null && uniqueConcreteMethod.canRecordTo(assumptions)) {
+                uniqueConcreteMethod.recordTo(assumptions);
+                return uniqueConcreteMethod.getResult();
             }
         }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -74,10 +74,8 @@
             return objectStamp.type().hasFinalizer();
         } else if (objectStamp.type() != null) {
             AssumptionResult<Boolean> result = objectStamp.type().hasFinalizableSubclass();
-            if (result.isAssumptionFree()) {
-                return result.getResult();
-            } else if (assumptions != null) {
-                assumptions.record(result);
+            if (result.canRecordTo(assumptions)) {
+                result.recordTo(assumptions);
                 return result.getResult();
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeCheckNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeCheckNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -79,15 +79,14 @@
             if (result != null) {
                 return result;
             }
+
             Assumptions assumptions = graph() == null ? null : graph().getAssumptions();
-            if (assumptions != null) {
-                AssumptionResult<ResolvedJavaType> leafConcreteSubtype = stampType.findLeafConcreteSubtype();
-                if (leafConcreteSubtype != null) {
-                    result = findSynonym(type(), leafConcreteSubtype.getResult(), true, true);
-                    if (result != null) {
-                        assumptions.record(leafConcreteSubtype);
-                        return result;
-                    }
+            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = stampType.findLeafConcreteSubtype();
+            if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions)) {
+                result = findSynonym(type(), leafConcreteSubtype.getResult(), true, true);
+                if (result != null) {
+                    leafConcreteSubtype.recordTo(assumptions);
+                    return result;
                 }
             }
         }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AssumptionInlineInfo.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AssumptionInlineInfo.java	Fri Aug 28 11:23:08 2015 -0700
@@ -48,13 +48,13 @@
 
     @Override
     public Collection<Node> inline(Providers providers) {
-        invoke.asNode().graph().getAssumptions().record(takenAssumption);
+        takenAssumption.recordTo(invoke.asNode().graph().getAssumptions());
         return super.inline(providers);
     }
 
     @Override
     public void tryToDevirtualizeInvoke(Providers providers) {
-        invoke.asNode().graph().getAssumptions().record(takenAssumption);
+        takenAssumption.recordTo(invoke.asNode().graph().getAssumptions());
         InliningUtil.replaceInvokeCallTarget(invoke, graph(), InvokeKind.Special, concrete);
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -66,7 +66,7 @@
     /*
      * Looks at the given stamp and determines if it is an exact type (or can be assumed to be an
      * exact type) and if it is a cloneable type.
-     * 
+     *
      * If yes, then the exact type is returned, otherwise it returns null.
      */
     protected static ResolvedJavaType getConcreteType(Stamp stamp, Assumptions assumptions, MetaAccessProvider metaAccess) {
@@ -78,12 +78,12 @@
             return null;
         } else if (objectStamp.isExactType()) {
             return isCloneableType(objectStamp.type(), metaAccess) ? objectStamp.type() : null;
-        } else if (assumptions != null) {
-            AssumptionResult<ResolvedJavaType> leafConcreteSubtype = objectStamp.type().findLeafConcreteSubtype();
-            if (leafConcreteSubtype != null && isCloneableType(leafConcreteSubtype.getResult(), metaAccess)) {
-                assumptions.record(leafConcreteSubtype);
-                return leafConcreteSubtype.getResult();
-            }
+        }
+
+        AssumptionResult<ResolvedJavaType> leafConcreteSubtype = objectStamp.type().findLeafConcreteSubtype();
+        if (leafConcreteSubtype != null && leafConcreteSubtype.canRecordTo(assumptions) && isCloneableType(leafConcreteSubtype.getResult(), metaAccess)) {
+            leafConcreteSubtype.recordTo(assumptions);
+            return leafConcreteSubtype.getResult();
         }
         return null;
     }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MethodHandleNode.java	Fri Aug 28 11:18:35 2015 -0700
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MethodHandleNode.java	Fri Aug 28 11:23:08 2015 -0700
@@ -191,15 +191,15 @@
             ResolvedJavaType receiverType = StampTool.typeOrNull(receiver.stamp());
             if (receiverType != null) {
                 AssumptionResult<ResolvedJavaMethod> concreteMethod = receiverType.findUniqueConcreteMethod(target);
-                if (concreteMethod != null) {
-                    assumptions.record(concreteMethod);
+                if (concreteMethod != null && concreteMethod.canRecordTo(assumptions)) {
+                    concreteMethod.recordTo(assumptions);
                     return createTargetInvokeNode(intrinsicMethod, concreteMethod.getResult(), original, bci, returnType, arguments);
                 }
             }
         } else {
             AssumptionResult<ResolvedJavaMethod> concreteMethod = target.getDeclaringClass().findUniqueConcreteMethod(target);
-            if (concreteMethod != null) {
-                assumptions.record(concreteMethod);
+            if (concreteMethod != null && concreteMethod.canRecordTo(assumptions)) {
+                concreteMethod.recordTo(assumptions);
                 return createTargetInvokeNode(intrinsicMethod, concreteMethod.getResult(), original, bci, returnType, arguments);
             }
         }