Mercurial > hg > truffle
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); + + } } } }