# HG changeset patch # User Paul Woegerer # Date 1423825226 -3600 # Node ID dd7d436a7e19ff2333f7107be80350032d88f934 # Parent ef292a5bb79ddf0bbd8b3f1c9909eca7d9cd84f8# Parent 78510d27786b344b901d7a86db90e83f6b8a3ad3 Merge diff -r ef292a5bb79d -r dd7d436a7e19 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Fri Feb 13 12:00:26 2015 +0100 @@ -52,6 +52,6 @@ @Override public void generate(NodeLIRBuilderTool gen) { Value addr = getLocation().generateAddress(gen, gen.getLIRGeneratorTool(), gen.operand(getObject())); - gen.setResult(this, addr); + gen.setResult(this, gen.getLIRGeneratorTool().asAllocatable(addr)); } } diff -r ef292a5bb79d -r dd7d436a7e19 graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Fri Feb 13 12:00:26 2015 +0100 @@ -65,6 +65,17 @@ /* If the cast is unused, it can be eliminated. */ return input; } + + assert !stamp().isCompatible(input.stamp()); + if (input.isConstant()) { + /* Null pointers are uncritical for GC, so they can be constant folded. */ + if (input.asJavaConstant().isNull()) { + return ConstantNode.forIntegerStamp(stamp(), 0); + } else if (input.asJavaConstant().getKind().isNumericInteger() && input.asJavaConstant().asLong() == 0) { + return ConstantNode.forConstant(stamp(), JavaConstant.NULL_POINTER, tool.getMetaAccess()); + } + } + return this; } diff -r ef292a5bb79d -r dd7d436a7e19 graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Fri Feb 13 12:00:26 2015 +0100 @@ -113,6 +113,8 @@ protected void rewriteNode(StructuredGraph graph, Node node) { if (node instanceof CheckCastNode) { rewriteCheckCast(graph, (CheckCastNode) node); + } else if (node instanceof PiNode) { + rewritePi(graph, (PiNode) node); } else if (node instanceof LoadFieldNode) { rewriteLoadField(graph, (LoadFieldNode) node); } else if (node instanceof AccessIndexedNode) { @@ -133,6 +135,16 @@ } /** + * Remove casts between word types (which by now no longer have kind Object). + */ + protected void rewritePi(StructuredGraph graph, PiNode node) { + if (node.getKind() == wordKind) { + node.replaceAtUsages(node.object()); + graph.removeFloating(node); + } + } + + /** * Fold constant field reads, e.g. enum constants. */ protected void rewriteLoadField(StructuredGraph graph, LoadFieldNode node) {