changeset 10892:caa8706c6202

CFG: attach proxies to loop exits
author Bernhard Urban <bernhard.urban@jku.at>
date Fri, 26 Jul 2013 20:18:41 +0200
parents 8c0ab217ed00
children 968215f13aad
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java
diffstat 2 files changed, 12 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Fri Jul 26 20:18:41 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Fri Jul 26 20:18:41 2013 +0200
@@ -123,6 +123,16 @@
     private void identifyBlock(Block block) {
         Node cur = block.getBeginNode();
         Node last;
+
+        // assign proxies of a loop exit to this block
+        if (cur instanceof AbstractBeginNode) {
+            for (Node usage : cur.usages()) {
+                if (usage instanceof ProxyNode) {
+                    nodeToBlock.set(usage, block);
+                }
+            }
+        }
+
         do {
             assert !cur.isDeleted();
 
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 20:18:41 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Fri Jul 26 20:18:41 2013 +0200
@@ -258,9 +258,9 @@
         if (prevBlock != null) {
             return;
         }
-        // PhiNodes and FixedNodes should already have been placed in blocks by
+        // PhiNodes, ProxyNodes and FixedNodes should already have been placed in blocks by
         // ControlFlowGraph.identifyBlocks
-        if (node instanceof PhiNode || node instanceof FixedNode) {
+        if (node instanceof PhiNode || node instanceof ProxyNode || node instanceof FixedNode) {
             throw new SchedulingError("%s should already have been placed in a block", node);
         }