changeset 23017:2b32ccbf4999

BinaryGraphPrinter: add phi nodes to their merge's block
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Wed, 18 Nov 2015 17:52:38 +0100
parents 27ee22a166d4
children 4af472d10ad6
files graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java
diffstat 1 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java	Wed Nov 18 17:49:07 2015 +0100
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java	Wed Nov 18 17:52:38 2015 +0100
@@ -37,11 +37,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-import jdk.vm.ci.meta.JavaType;
-import jdk.vm.ci.meta.ResolvedJavaField;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.Signature;
-
 import com.oracle.graal.compiler.common.cfg.BlockMap;
 import com.oracle.graal.debug.Debug;
 import com.oracle.graal.graph.CachedGraph;
@@ -66,6 +61,11 @@
 import com.oracle.graal.nodes.cfg.ControlFlowGraph;
 import com.oracle.graal.phases.schedule.SchedulePhase;
 
+import jdk.vm.ci.meta.JavaType;
+import jdk.vm.ci.meta.ResolvedJavaField;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+import jdk.vm.ci.meta.Signature;
+
 public class BinaryGraphPrinter implements GraphPrinter {
 
     private static final int CONSTANT_POOL_MAX_SIZE = 8000;
@@ -428,6 +428,20 @@
         return node.getId();
     }
 
+    private Object getBlockForNode(Node node, NodeMap<Block> nodeToBlocks) {
+        if (nodeToBlocks.isNew(node)) {
+            return "NEW (not in schedule)";
+        } else {
+            Block block = nodeToBlocks.get(node);
+            if (block != null) {
+                return block.getId();
+            } else if (node instanceof PhiNode) {
+                return getBlockForNode(((PhiNode) node).merge(), nodeToBlocks);
+            }
+        }
+        return null;
+    }
+
     private void writeNodes(Graph graph, NodeMap<Block> nodeToBlocks, ControlFlowGraph cfg) throws IOException {
         Map<Object, Object> props = new HashMap<>();
 
@@ -444,13 +458,9 @@
                 }
             }
             if (nodeToBlocks != null) {
-                if (nodeToBlocks.isNew(node)) {
-                    props.put("node-to-block", "NEW (not in schedule)");
-                } else {
-                    Block block = nodeToBlocks.get(node);
-                    if (block != null) {
-                        props.put("node-to-block", block.getId());
-                    }
+                Object block = getBlockForNode(node, nodeToBlocks);
+                if (block != null) {
+                    props.put("node-to-block", block);
                 }
             }
 
@@ -535,9 +545,23 @@
             writeInt(blocks.size());
             for (Block block : blocks) {
                 List<Node> nodes = blockToNodes.get(block);
+                List<Node> extraNodes = new LinkedList<>();
                 writeInt(block.getId());
-                writeInt(nodes.size());
                 for (Node node : nodes) {
+                    if (node instanceof AbstractMergeNode) {
+                        AbstractMergeNode merge = (AbstractMergeNode) node;
+                        for (PhiNode phi : merge.phis()) {
+                            if (!nodes.contains(phi)) {
+                                extraNodes.add(phi);
+                            }
+                        }
+                    }
+                }
+                writeInt(nodes.size() + extraNodes.size());
+                for (Node node : nodes) {
+                    writeInt(getNodeId(node));
+                }
+                for (Node node : extraNodes) {
                     writeInt(getNodeId(node));
                 }
                 writeInt(block.getSuccessors().size());