changeset 21224:993a5446ea6f

NodeLIRBuilder: use LIRKind.merge() to create kind for PHIs. *** NodeLIRBuilder: intro PhiOut *** SSA NodeLIRBuilder: calculate better LIRKinds for phis. *** NodeLIRBuilder: remove PhiOut.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 29 Apr 2015 11:40:04 +0200
parents 31c4d3f91d30
children 422c91256dd9
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java
diffstat 1 files changed, 29 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Tue Apr 21 18:12:01 2015 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Wed Apr 29 11:40:04 2015 +0200
@@ -198,11 +198,34 @@
         return merge.usages().filter(ValuePhiNode.class).filter(merge::isPhiAtMerge);
     }
 
-    protected Value[] createPhiIn(AbstractMergeNode merge) {
+    protected LIRKind getExactPhiKind(PhiNode phi) {
+        ArrayList<Value> values = new ArrayList<>(phi.valueCount());
+        for (int i = 0; i < phi.valueCount(); i++) {
+            ValueNode node = phi.valueAt(i);
+            Value value = node instanceof ConstantNode ? ((ConstantNode) node).asJavaConstant() : getOperand(node);
+            if (value != null) {
+                values.add(value);
+            } else {
+                assert isPhiInputFromBackedge(phi, i);
+            }
+        }
+        LIRKind derivedKind = LIRKind.merge(values.toArray(new Value[values.size()]));
+        assert derivedKind.getPlatformKind() != Kind.Object || !derivedKind.isDerivedReference();
+        assert derivedKind.getPlatformKind().equals(gen.getLIRKind(phi.stamp()).getPlatformKind());
+        return derivedKind;
+    }
+
+    private static boolean isPhiInputFromBackedge(PhiNode phi, int index) {
+        AbstractMergeNode merge = phi.merge();
+        AbstractEndNode end = merge.phiPredecessorAt(index);
+        return end instanceof LoopEndNode && ((LoopEndNode) end).loopBegin().equals(merge);
+    }
+
+    private Value[] createPhiIn(AbstractMergeNode merge) {
         List<Value> values = new ArrayList<>();
         for (ValuePhiNode phi : valuePhis(merge)) {
             assert getOperand(phi) == null;
-            Variable value = gen.newVariable(getPhiKind(phi));
+            Variable value = gen.newVariable(getExactPhiKind(phi));
             values.add(value);
             setResult(phi, value);
         }
@@ -234,6 +257,10 @@
                         AbstractMergeNode merge = (AbstractMergeNode) begin;
                         LabelOp label = (LabelOp) gen.getResult().getLIR().getLIRforBlock(block).get(0);
                         label.setIncomingValues(createPhiIn(merge));
+                        if (Options.PrintIRWithLIR.getValue() && !TTY.isSuppressed()) {
+                            TTY.println("Created PhiIn: " + label);
+
+                        }
                     }
                 }
             }