diff graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java @ 2763:5e8a69041cd7

Model phi inputs as direct inputs in the graph instead of referring to the framestates of the predecessors.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Mon, 23 May 2011 14:51:18 +0200
parents bdaf31906620
children 99912abb3ff7
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java	Sat May 21 17:56:11 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/value/FrameState.java	Mon May 23 14:51:18 2011 +0200
@@ -256,17 +256,20 @@
      * @param block the block begin for which we are creating the phi
      * @param i the index into the stack for which to create a phi
      */
-    public void setupPhiForStack(BlockBegin block, int i) {
+    public Phi setupPhiForStack(BlockBegin block, int i) {
         Value p = stackAt(i);
         if (p != null) {
             if (p instanceof Phi) {
                 Phi phi = (Phi) p;
                 if (phi.block() == block && phi.isOnStack() && phi.stackIndex() == i) {
-                    return;
+                    return phi;
                 }
             }
-            inputs().set(localsSize + i, new Phi(p.kind, block, -i - 1, graph()));
+            Phi phi = new Phi(p.kind, block, -i - 1, graph());
+            inputs().set(localsSize + i, phi);
+            return phi;
         }
+        return null;
     }
 
     /**
@@ -274,15 +277,17 @@
      * @param block the block begin for which we are creating the phi
      * @param i the index of the local variable for which to create the phi
      */
-    public void setupPhiForLocal(BlockBegin block, int i) {
+    public Phi setupPhiForLocal(BlockBegin block, int i) {
         Value p = localAt(i);
         if (p instanceof Phi) {
             Phi phi = (Phi) p;
             if (phi.block() == block && phi.isLocal() && phi.localIndex() == i) {
-                return;
+                return phi;
             }
         }
-        storeLocal(i, new Phi(p.kind, block, i, graph()));
+        Phi phi = new Phi(p.kind, block, i, graph());
+        storeLocal(i, phi);
+        return phi;
     }
 
     /**
@@ -312,28 +317,6 @@
         return localsSize + stackSize;
     }
 
-    public void checkPhis(BlockBegin block, FrameState other) {
-        checkSize(other);
-        for (int i = 0; i < valuesSize(); i++) {
-            Value x = valueAt(i);
-            Value y = other.valueAt(i);
-            if (x != null && x != y) {
-                if (x instanceof Phi) {
-                    Phi phi = (Phi) x;
-                    if (phi.block() == block) {
-                        for (int j = 0; j < phi.phiInputCount(); j++) {
-                            if (phi.inputIn(other) == null) {
-                                throw new CiBailout("phi " + phi + " has null operand at new predecessor");
-                            }
-                        }
-                        continue;
-                    }
-                }
-                throw new CiBailout("instruction is not a phi or null at " + i);
-            }
-        }
-    }
-
     private void checkSize(FrameStateAccess other) {
         if (other.stackSize() != stackSize()) {
             throw new CiBailout("stack sizes do not match");
@@ -342,7 +325,7 @@
         }
     }
 
-    public void merge(BlockBegin block, FrameStateAccess other) {
+    public void merge(BlockBegin block, FrameStateAccess other, boolean blockAppended) {
         checkSize(other);
         for (int i = 0; i < valuesSize(); i++) {
             Value x = valueAt(i);
@@ -359,12 +342,34 @@
                         inputs().set(i, null);
                         continue;
                     }
+                    Phi phi = null;
                     if (i < localsSize) {
                         // this a local
-                        setupPhiForLocal(block, i);
+                        phi = setupPhiForLocal(block, i);
                     } else {
                         // this is a stack slot
-                        setupPhiForStack(block, i - localsSize);
+                        phi = setupPhiForStack(block, i - localsSize);
+                    }
+
+                    Phi originalPhi = phi;
+                    if (phi.phiInputCount() == 0) {
+                        int size = block.predecessors().size();
+                        if (blockAppended) {
+                            size--;
+                        }
+                        for (int j = 0; j < size; ++j) {
+                            phi = phi.addInput(x);
+                        }
+                        phi = phi.addInput(y);
+                    } else {
+                        phi = phi.addInput(y);
+                    }
+                    if (originalPhi != phi) {
+                        for (int j = 0; j < other.localsSize() + other.stackSize(); ++j) {
+                            if (other.valueAt(j) == originalPhi) {
+                                other.setValueAt(j, phi);
+                            }
+                        }
                     }
                 }
             }
@@ -467,4 +472,9 @@
     public void visitFrameState(FrameState i) {
         // nothing to do for now
     }
+
+    @Override
+    public void setValueAt(int j, Value v) {
+        inputs().set(j, v);
+    }
 }