changeset 3230:cfcd3c52cb08

Apply rematerializtion only to GVNed Nodes
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Thu, 21 Jul 2011 14:58:08 +0200
parents 4a6bda6cfe28
children be914c1e065a
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java
diffstat 2 files changed, 18 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Thu Jul 21 11:32:22 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Thu Jul 21 14:58:08 2011 +0200
@@ -127,21 +127,25 @@
         }
 
         if (GraalOptions.OptGVN) {
+            graph.recordModifications(EdgeType.USAGES); // GVN 'ideals' will get new usages
             new GlobalValueNumberingPhase().apply(graph);
             if (GraalOptions.Rematerialize) {
                 //new Rematerialization2Phase().apply(graph);
                 new RematerializationPhase().apply(graph);
             }
+            graph.stopRecordModifications();
         }
 
         new LoweringPhase(compilation.runtime).apply(graph);
         if (GraalOptions.Lower) {
             new MemoryPhase().apply(graph);
             if (GraalOptions.OptGVN) {
+                graph.recordModifications(EdgeType.USAGES);
                 new GlobalValueNumberingPhase().apply(graph);
                 if (GraalOptions.Rematerialize) {
                     new RematerializationPhase().apply(graph);
                 }
+                graph.stopRecordModifications();
             }
             if (GraalOptions.OptReadElimination) {
                 new ReadEliminationPhase().apply(graph);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java	Thu Jul 21 11:32:22 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java	Thu Jul 21 14:58:08 2011 +0200
@@ -42,27 +42,34 @@
 
     @Override
     protected void run(Graph graph) {
+        Iterable<Node> modifiedNodes = graph.getModifiedNodes();
+        graph.stopRecordModifications();
+        NodeWorkList work = graph.createNodeWorkList();
+        for (Node modified : modifiedNodes) {
+            if (modified instanceof FloatingNode) {
+                work.add(modified);
+            }
+        }
+
+        if (work.isEmpty()) {
+            return;
+        }
+
         final IdentifyBlocksPhase s = new IdentifyBlocksPhase(true);
         s.apply(graph);
 
         newNodesToBlock = new HashMap<Node, Block>();
         nodeToBlock = s.getNodeToBlock();
         blocks = s.getBlocks();
-
         probablityCache = new UsageProbability[blocks.size()];
 
-        NodeWorkList work = graph.createNodeWorkList();
-        NodeBitMap done = graph.createNodeBitMap();
-        work.addAll(graph.getNodes(FloatingNode.class));
-
         for (Node node : work) {
             if (node instanceof Phi || node instanceof Local || node instanceof Constant || node instanceof LocationNode) {
-                done.mark(node);
                 continue;
             }
             boolean delay = false;
             for (Node usage : node.usages()) {
-                if (usage instanceof FloatingNode && !(usage instanceof Phi) && done.isNotNewNotMarked(usage)) {
+                if (usage instanceof FloatingNode && !(usage instanceof Phi) && work.isInQueue(usage)) {
                     delay = true;
                     break;
                 }
@@ -71,7 +78,6 @@
                 work.addAgain(node);
                 continue;
             }
-            done.mark(node);
             Arrays.fill(probablityCache, null);
             ignoreUsages = true;
             Block block = nodeToBlock.get(node);