changeset 10894:af441d477a40

SchedulingPhase: add option for new memory aware scheduling (GRAAL-159)
author Bernhard Urban <bernhard.urban@jku.at>
date Fri, 26 Jul 2013 20:18:42 +0200
parents 968215f13aad
children 0aba970c89f9
files graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java
diffstat 2 files changed, 31 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java	Fri Jul 26 20:18:42 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java	Fri Jul 26 20:18:42 2013 +0200
@@ -235,6 +235,8 @@
 
     @Option(help = "")
     public static final OptionValue<Boolean> MemoryAwareScheduling = new OptionValue<>(true);
+    @Option(help = "")
+    public static final OptionValue<Boolean> NewMemoryAwareScheduling = new OptionValue<>(false);
 
     // Translating tableswitch instructions
     @Option(help = "")
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 20:18:42 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 20:18:42 2013 +0200
@@ -72,6 +72,10 @@
         EARLIEST, LATEST, LATEST_OUT_OF_LOOPS
     }
 
+    public static enum MemoryScheduling {
+        NONE, CONSERVATIVE, OPTIMAL
+    }
+
     /**
      * This closure iterates over all nodes of a scheduled graph (it expects a
      * {@link SchedulingStrategy#EARLIEST} schedule) and keeps a list of "active" reads. Whenever it
@@ -178,6 +182,7 @@
     private BlockMap<List<ScheduledNode>> blockToNodesMap;
     private final Map<FloatingNode, List<FixedNode>> phantomUsages = new IdentityHashMap<>();
     private final Map<FixedNode, List<FloatingNode>> phantomInputs = new IdentityHashMap<>();
+    private final MemoryScheduling memsched;
     private final SchedulingStrategy selectedStrategy;
 
     public SchedulePhase() {
@@ -185,17 +190,31 @@
     }
 
     public SchedulePhase(SchedulingStrategy strategy) {
+        if (MemoryAwareScheduling.getValue() && NewMemoryAwareScheduling.getValue()) {
+            throw new SchedulingError("cannot enable both: MemoryAware- and NewMemoryAwareScheduling");
+        }
+        if (MemoryAwareScheduling.getValue()) {
+            this.memsched = MemoryScheduling.CONSERVATIVE;
+        } else if (NewMemoryAwareScheduling.getValue()) {
+            this.memsched = MemoryScheduling.OPTIMAL;
+        } else {
+            this.memsched = MemoryScheduling.NONE;
+        }
         this.selectedStrategy = strategy;
     }
 
+    public SchedulePhase(SchedulingStrategy strategy, MemoryScheduling memsched) {
+        this.selectedStrategy = strategy;
+        this.memsched = memsched;
+    }
+
     @Override
     protected void run(StructuredGraph graph) {
         cfg = ControlFlowGraph.compute(graph, true, true, true, true);
         earliestCache = graph.createNodeMap();
         blockToNodesMap = new BlockMap<>(cfg);
 
-        if (MemoryAwareScheduling.getValue() && selectedStrategy != SchedulingStrategy.EARLIEST && graph.getNodes(FloatingReadNode.class).isNotEmpty()) {
-
+        if (memsched == MemoryScheduling.CONSERVATIVE && selectedStrategy != SchedulingStrategy.EARLIEST && graph.getNodes(FloatingReadNode.class).isNotEmpty()) {
             assignBlockToNodes(graph, SchedulingStrategy.EARLIEST);
             sortNodesWithinBlocks(graph, SchedulingStrategy.EARLIEST);
 
@@ -204,10 +223,15 @@
 
             cfg.clearNodeToBlock();
             blockToNodesMap = new BlockMap<>(cfg);
+
+            assignBlockToNodes(graph, selectedStrategy);
+            sortNodesWithinBlocks(graph, selectedStrategy);
+        } else if (memsched == MemoryScheduling.OPTIMAL && selectedStrategy != SchedulingStrategy.EARLIEST && graph.getNodes(FloatingReadNode.class).isNotEmpty()) {
+            // TODO
+        } else {
+            assignBlockToNodes(graph, selectedStrategy);
+            sortNodesWithinBlocks(graph, selectedStrategy);
         }
-
-        assignBlockToNodes(graph, selectedStrategy);
-        sortNodesWithinBlocks(graph, selectedStrategy);
     }
 
     public ControlFlowGraph getCFG() {