changeset 19249:ec8402f4e00a

introduced OptimisiticAssumption base class and improved javadoc in Assumptions API
author Doug Simon <doug.simon@oracle.com>
date Mon, 09 Feb 2015 11:31:53 +0100
parents a2ff253c458f
children 8ab925a6f724
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionValidAssumption.java
diffstat 2 files changed, 53 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java	Tue Feb 10 16:44:19 2015 -0800
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java	Mon Feb 09 11:31:53 2015 +0100
@@ -31,7 +31,9 @@
 import com.oracle.graal.api.meta.*;
 
 /**
- * Class for recording optimistic assumptions made during compilation.
+ * Class for recording assumptions made during compilation. {@link OptimisticAssumption}s can only
+ * be recorded in an {@link Assumptions} object if it {@linkplain #useOptimisticAssumptions()
+ * allows} them.
  */
 public final class Assumptions implements Serializable, Iterable<Assumptions.Assumption> {
 
@@ -45,7 +47,24 @@
         private static final long serialVersionUID = -1936652569665112915L;
     }
 
-    public static final class NoFinalizableSubclass extends Assumption {
+    /**
+     * Abstract base class for optimistic assumptions. An optimistic assumption assumes a property
+     * of the runtime that may be invalidated by subsequent execution (e.g., that a class has no
+     * subclasses implementing {@link NoFinalizableSubclass Object.finalize()}). A non-optimistic
+     * assumption assumes a property that will most likely only be invalidated by an external
+     * interface to the runtime (e.g., a {@linkplain MethodContents breakpoint is set or a class is
+     * redefined}).
+     */
+    public abstract static class OptimisticAssumption extends Assumption {
+
+        private static final long serialVersionUID = -1936652569665112932L;
+    }
+
+    /**
+     * An optimistic assumption that a given class has no subclasses implementing
+     * {@link Object#finalize()}).
+     */
+    public static final class NoFinalizableSubclass extends OptimisticAssumption {
 
         private static final long serialVersionUID = 6451169735564055081L;
 
@@ -77,9 +96,9 @@
     }
 
     /**
-     * An assumption about a unique subtype of a given type.
+     * An optimistic assumption that a given type has a given unique subtype.
      */
-    public static final class ConcreteSubtype extends Assumption {
+    public static final class ConcreteSubtype extends OptimisticAssumption {
 
         private static final long serialVersionUID = -1457173265437676252L;
 
@@ -125,9 +144,9 @@
     }
 
     /**
-     * An assumption about a unique implementation of a virtual method.
+     * An optimistic assumption that a given virtual method has a given unique implementation.
      */
-    public static final class ConcreteMethod extends Assumption {
+    public static final class ConcreteMethod extends OptimisticAssumption {
 
         private static final long serialVersionUID = -7636746737947390059L;
 
@@ -179,7 +198,14 @@
     }
 
     /**
-     * An assumption that specified that a method was used during the compilation.
+     * An non-optimistic assumption that the bytecodes of a given method used during compilation
+     * will not change. This kind of dependency may be used to invalidate and deoptimize compiled
+     * code when:
+     * <ul>
+     * <li>one of its constituent methods is redefined or</li>
+     * <li>a breakpoint is set in one of its constituent methods and the runtime only implements
+     * breakpoint support in non-compiled code.
+     * </ul>
      */
     public static final class MethodContents extends Assumption {
 
@@ -212,9 +238,9 @@
     }
 
     /**
-     * Assumption that a call site's method handle did not change.
+     * An optimistic assumption that a given call site's method handle did not change.
      */
-    public static final class CallSiteTargetValue extends Assumption {
+    public static final class CallSiteTargetValue extends OptimisticAssumption {
 
         private static final long serialVersionUID = 1732459941784550371L;
 
@@ -255,11 +281,19 @@
      * Graal/HotSpot implementation.
      */
     private Assumption[] list;
-    private boolean useOptimisticAssumptions;
     private int count;
 
-    public Assumptions(boolean useOptimisticAssumptions) {
-        this.useOptimisticAssumptions = useOptimisticAssumptions;
+    /**
+     * Specifies whether {@link OptimisticAssumption}s can be made.
+     */
+    private boolean allowOptimisticAssumptions;
+
+    /**
+     *
+     * @param allowOptimisticAssumptions
+     */
+    public Assumptions(boolean allowOptimisticAssumptions) {
+        this.allowOptimisticAssumptions = allowOptimisticAssumptions;
         list = new Assumption[4];
     }
 
@@ -272,8 +306,11 @@
         return count == 0;
     }
 
+    /**
+     * Determines whether {@link OptimisticAssumption}s can be made.
+     */
     public boolean useOptimisticAssumptions() {
-        return useOptimisticAssumptions;
+        return allowOptimisticAssumptions;
     }
 
     @Override
@@ -293,7 +330,7 @@
         }
         if (obj instanceof Assumptions) {
             Assumptions that = (Assumptions) obj;
-            if (useOptimisticAssumptions != that.useOptimisticAssumptions || count != that.count) {
+            if (allowOptimisticAssumptions != that.allowOptimisticAssumptions || count != that.count) {
                 return false;
             }
             for (int i = 0; i < count; i++) {
@@ -338,7 +375,6 @@
      * @param receiverType the type that is assumed to have no finalizable subclasses
      */
     public void recordNoFinalizableSubclassAssumption(ResolvedJavaType receiverType) {
-        assert useOptimisticAssumptions;
         record(new NoFinalizableSubclass(receiverType));
     }
 
@@ -350,7 +386,6 @@
      * @param subtype the one concrete subtype
      */
     public void recordConcreteSubtype(ResolvedJavaType context, ResolvedJavaType subtype) {
-        assert useOptimisticAssumptions;
         record(new ConcreteSubtype(context, subtype));
     }
 
@@ -363,7 +398,6 @@
      * @param impl the concrete method that is the only possible target for the virtual call
      */
     public void recordConcreteMethod(ResolvedJavaMethod method, ResolvedJavaType context, ResolvedJavaMethod impl) {
-        assert useOptimisticAssumptions;
         record(new ConcreteMethod(method, context, impl));
     }
 
@@ -377,6 +411,7 @@
     }
 
     public void record(Assumption assumption) {
+        assert allowOptimisticAssumptions || !(assumption instanceof OptimisticAssumption) : "cannot make optimistic assumption: " + assumption;
         if (list == null) {
             list = new Assumption[4];
         } else {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionValidAssumption.java	Tue Feb 10 16:44:19 2015 -0800
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionValidAssumption.java	Mon Feb 09 11:31:53 2015 +0100
@@ -25,7 +25,7 @@
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.truffle.*;
 
-public final class AssumptionValidAssumption extends Assumptions.Assumption {
+public final class AssumptionValidAssumption extends Assumptions.OptimisticAssumption {
 
     private static final long serialVersionUID = 2010244979610891262L;