Mercurial > hg > truffle
diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java @ 6393:adf0879a41c1
more escape analysis infrastructure: change EscapeOp behavior, make MaterializeObjectNodes roots for escape analysis
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 13 Sep 2012 11:41:43 +0200 |
parents | 41fc19bd618d |
children | 6ad5bf2efb5e |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Thu Sep 13 11:29:18 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Thu Sep 13 11:41:43 2012 +0200 @@ -30,6 +30,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; +import com.oracle.graal.nodes.virtual.*; /** * The {@code NewArrayNode} class is the base of all instructions that allocate arrays. @@ -85,58 +86,65 @@ return 1; } - public EscapeOp getEscapeOp() { - Constant constantLength = length().asConstant(); - if (constantLength != null && constantLength.asInt() >= 0 && constantLength.asInt() < MaximumEscapeAnalysisArrayLength) { - return ESCAPE; - } else { - return null; - } - } - @Override public void lower(LoweringTool tool) { tool.getRuntime().lower(this, tool); } - private static final EscapeOp ESCAPE = new EscapeOp() { + @Override + public EscapeOp getEscapeOp() { + Constant constantLength = length().asConstant(); + if (constantLength != null && constantLength.asInt() >= 0 && constantLength.asInt() < MaximumEscapeAnalysisArrayLength) { + return new EscapeOpImpl(); + } else { + return null; + } + } + + private final class EscapeOpImpl extends EscapeOp { @Override - public EscapeField[] fields(Node node) { - NewArrayNode x = (NewArrayNode) node; - assert x.elementType.arrayOf().isArrayClass(); - int length = x.dimension(0).asConstant().asInt(); - EscapeField[] fields = new EscapeField[length]; - for (int i = 0; i < length; i++) { + public ResolvedJavaType type() { + return elementType.arrayOf(); + } + + @Override + public EscapeField[] fields() { + int constantLength = dimension(0).asConstant().asInt(); + EscapeField[] fields = new EscapeField[constantLength]; + for (int i = 0; i < constantLength; i++) { Integer representation = i; - fields[i] = new EscapeField(Integer.toString(i), representation, ((NewArrayNode) node).elementType()); + fields[i] = new EscapeField(Integer.toString(i), representation, elementType()); } return fields; } @Override - public ResolvedJavaType type(Node node) { - NewArrayNode x = (NewArrayNode) node; - return x.elementType.arrayOf(); + public ValueNode[] fieldState() { + ValueNode[] state = new ValueNode[dimension(0).asConstant().asInt()]; + for (int i = 0; i < state.length; i++) { + state[i] = ConstantNode.defaultForKind(elementType().kind(), graph()); + } + return state; } @Override - public void beforeUpdate(Node node, Node usage) { + public void beforeUpdate(Node usage) { if (usage instanceof ArrayLengthNode) { ArrayLengthNode x = (ArrayLengthNode) usage; - StructuredGraph graph = (StructuredGraph) node.graph(); - x.replaceAtUsages(((NewArrayNode) node).dimension(0)); + StructuredGraph graph = (StructuredGraph) graph(); + x.replaceAtUsages(dimension(0)); graph.removeFixed(x); } else { - super.beforeUpdate(node, usage); + beforeUpdate(NewArrayNode.this, usage); } } @Override - public int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) { + public int updateState(VirtualObjectNode virtualObject, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) { if (current instanceof AccessIndexedNode) { AccessIndexedNode x = (AccessIndexedNode) current; - if (GraphUtil.unProxify(x.array()) == node) { + if (GraphUtil.unProxify(x.array()) == virtualObject) { int index = ((AccessIndexedNode) current).index().asConstant().asInt(); StructuredGraph graph = (StructuredGraph) x.graph(); if (current instanceof LoadIndexedNode) { @@ -151,5 +159,6 @@ } return -1; } - }; + + } }