changeset 10803:4532725151cc

make MergeableState an abstract class instead of an interface
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 18 Jul 2013 12:04:09 +0200
parents e6bb7edcc66c
children 32d93a799694
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java
diffstat 3 files changed, 35 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Thu Jul 18 12:01:17 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Thu Jul 18 12:04:09 2013 +0200
@@ -66,7 +66,7 @@
         new ConditionalElimination(graph.start(), new State()).apply();
     }
 
-    public static class State implements MergeableState<State> {
+    public static class State extends MergeableState<State> {
 
         private IdentityHashMap<ValueNode, ResolvedJavaType> knownTypes;
         private HashSet<ValueNode> knownNonNull;
@@ -208,18 +208,6 @@
         }
 
         @Override
-        public void loopBegin(LoopBeginNode loopBegin) {
-        }
-
-        @Override
-        public void loopEnds(LoopBeginNode loopBegin, List<State> loopEndStates) {
-        }
-
-        @Override
-        public void afterSplit(AbstractBeginNode node) {
-        }
-
-        @Override
         public State clone() {
             return new State(this);
         }
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Thu Jul 18 12:01:17 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Thu Jul 18 12:04:09 2013 +0200
@@ -202,7 +202,7 @@
         }
     }
 
-    private class Probability implements MergeableState<Probability> {
+    private class Probability extends MergeableState<Probability> {
 
         public double probability;
         public HashSet<LoopInfo> loops;
@@ -310,7 +310,7 @@
         }
     }
 
-    private class LoopCount implements MergeableState<LoopCount> {
+    private class LoopCount extends MergeableState<LoopCount> {
 
         public double count;
 
@@ -342,16 +342,6 @@
         public void loopBegin(LoopBeginNode loopBegin) {
             count *= loopBegin.loopFrequency();
         }
-
-        @Override
-        public void loopEnds(LoopBeginNode loopBegin, List<LoopCount> loopEndStates) {
-            // nothing to do...
-        }
-
-        @Override
-        public void afterSplit(AbstractBeginNode node) {
-            // nothing to do...
-        }
     }
 
     private class PropagateLoopFrequency extends PostOrderNodeIterator<LoopCount> {
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java	Thu Jul 18 12:01:17 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/MergeableState.java	Thu Jul 18 12:04:09 2013 +0200
@@ -26,15 +26,39 @@
 
 import com.oracle.graal.nodes.*;
 
-public interface MergeableState<T> {
+public abstract class MergeableState<T> {
+
+    @Override
+    public abstract T clone();
+
+    public abstract boolean merge(MergeNode merge, List<T> withStates);
 
-    T clone();
-
-    boolean merge(MergeNode merge, List<T> withStates);
+    /**
+     * This method is called before a loop is entered (before the {@link LoopBeginNode} is visited).
+     * 
+     * @param loopBegin the begin node of the loop
+     */
+    public void loopBegin(LoopBeginNode loopBegin) {
+        // empty default implementation
+    }
 
-    void loopBegin(LoopBeginNode loopBegin);
+    /**
+     * This method is called after all {@link LoopEndNode}s belonging to a loop have been visited.
+     * 
+     * @param loopBegin the begin node of the loop
+     * @param loopEndStates the states at the loop ends, sorted according to
+     *            {@link LoopBeginNode#orderedLoopEnds()}
+     */
+    public void loopEnds(LoopBeginNode loopBegin, List<T> loopEndStates) {
+        // empty default implementation
+    }
 
-    void loopEnds(LoopBeginNode loopBegin, List<T> loopEndStates);
-
-    void afterSplit(AbstractBeginNode node);
+    /**
+     * This method is called before the successors of a {@link ControlSplitNode} are visited.
+     * 
+     * @param node the successor of the control split that is about to be visited
+     */
+    public void afterSplit(AbstractBeginNode node) {
+        // empty default implementation
+    }
 }