# HG changeset patch # User Josef Eisl # Date 1430300404 -7200 # Node ID 993a5446ea6f5c18d7d12eff91e1abbbf10a21ce # Parent 31c4d3f91d30bef5b0d6069d766ea9e0e4dc035a NodeLIRBuilder: use LIRKind.merge() to create kind for PHIs. *** NodeLIRBuilder: intro PhiOut *** SSA NodeLIRBuilder: calculate better LIRKinds for phis. *** NodeLIRBuilder: remove PhiOut. diff -r 31c4d3f91d30 -r 993a5446ea6f graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java --- 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 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 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); + + } } } }