# HG changeset patch # User Doug Simon # Date 1336143267 -7200 # Node ID 8b5ef24da264e68da6a09cc9226eff5d60228f61 # Parent a250ca83684e3ea207a19f8b269d67775f5fb2f1 canonicalize load from a compile-constant, immutable array diff -r a250ca83684e -r 8b5ef24da264 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java Fri May 04 16:52:58 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadIndexedNode.java Fri May 04 16:54:27 2012 +0200 @@ -22,17 +22,21 @@ */ package com.oracle.graal.nodes.java; -import com.oracle.max.cri.ci.*; +import java.lang.reflect.*; + +import sun.misc.*; + import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ci.*; /** * The {@code LoadIndexedNode} represents a read from an element of an array. */ -public final class LoadIndexedNode extends AccessIndexedNode implements Lowerable, Node.IterableNodeType { +public final class LoadIndexedNode extends AccessIndexedNode implements Canonicalizable, Lowerable, Node.IterableNodeType { /** * Creates a new LoadIndexedNode. @@ -62,4 +66,21 @@ public void lower(CiLoweringTool tool) { tool.getRuntime().lower(this, tool); } + + @Override + public ValueNode canonical(CanonicalizerTool tool) { + if (index().isConstant() && array().isConstant() && !array().isNullConstant()) { + CiConstant arrayConst = array().asConstant(); + if (tool.isImmutable(arrayConst)) { + int index = index().asConstant().asInt(); + Object array = arrayConst.asObject(); + int length = Array.getLength(array); + if (index >= 0 && index < length) { + return ConstantNode.forCiConstant(elementKind().readUnsafeConstant(array, + Unsafe.ARRAY_OBJECT_BASE_OFFSET + index * Unsafe.ARRAY_OBJECT_INDEX_SCALE), tool.runtime(), graph()); + } + } + } + return this; + } }