# HG changeset patch # User Christian Wimmer # Date 1359988287 28800 # Node ID 20cc221ed5cac8dbc5aa9aeb222816a09e2f6bd8 # Parent ca9061b6694c9bf79badb5db7417cbaf82f65435# Parent d19837d236e5cd4f9d2ea06045a987fc902ad978 Merge diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Mon Feb 04 06:31:27 2013 -0800 @@ -84,4 +84,13 @@ * @throws IllegalArgumentException if {@code array} is not an array */ int lookupArrayLength(Constant array); + + /** + * Reads a value of this kind using a base address and a displacement. + * + * @param base the base address from which the value is read + * @param displacement the displacement within the object in bytes + * @return the read value encapsulated in a {@link Constant} object, or {@code null} if the value cannot be read. + */ + Constant readUnsafeConstant(Kind kind, Object base, long displacement); } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Mon Feb 04 06:31:27 2013 -0800 @@ -70,7 +70,7 @@ ResolvedJavaType elementalType = getElementalType(type); Class elementalClass; if (elementalType.isPrimitive()) { - elementalClass = type.getKind().toJavaClass(); + elementalClass = elementalType.getKind().toJavaClass(); } else { try { elementalClass = Class.forName(toJavaName(elementalType), true, loader); @@ -177,7 +177,7 @@ public static String toJavaName(JavaType type, boolean qualified) { Kind kind = type.getKind(); if (kind == Kind.Object) { - return internalNameToJava(type.getName(), qualified); + return internalNameToJava(type.getName(), qualified, false); } return type.getKind().getJavaName(); } @@ -196,10 +196,10 @@ * @return the Java name corresponding to {@code type} */ public static String toJavaName(JavaType type) { - return (type == null) ? null : internalNameToJava(type.getName(), true); + return (type == null) ? null : internalNameToJava(type.getName(), true, false); } - private static String internalNameToJava(String name, boolean qualified) { + private static String internalNameToJava(String name, boolean qualified, boolean classForNameCompatible) { switch (name.charAt(0)) { case 'L': { String result = name.substring(1, name.length() - 1).replace('/', '.'); @@ -210,10 +210,9 @@ } } return result; - } case '[': - return internalNameToJava(name.substring(1), qualified) + "[]"; + return classForNameCompatible ? name.replace('/', '.') : internalNameToJava(name.substring(1), qualified, classForNameCompatible) + "[]"; default: if (name.length() != 1) { throw new IllegalArgumentException("Illegal internal name: " + name); @@ -223,6 +222,19 @@ } /** + * Turns an class name in internal format into a resolved Java type. + */ + public static ResolvedJavaType classForName(String internal, MetaAccessProvider metaAccess, ClassLoader cl) { + Kind k = Kind.fromTypeString(internal); + try { + String n = internalNameToJava(internal, true, true); + return metaAccess.lookupJavaType(k.isPrimitive() ? k.toJavaClass() : Class.forName(n, true, cl)); + } catch (ClassNotFoundException cnfe) { + throw new IllegalArgumentException("could not instantiate class described by " + internal, cnfe); + } + } + + /** * Gets a string for a given method formatted according to a given format specification. A * format specification is composed of characters that are to be copied verbatim to the result * and specifiers that denote an attribute of the method that is to be copied to the result. A @@ -503,6 +515,29 @@ } /** + * Gets the method + * descriptor corresponding to this signature. For example: + * + *
+     * (ILjava/lang/String;D)V
+     * 
+ * + * . + * + * @param sig the {@link Signature} to be converted. + * @return the signature as a string + */ + public static String signatureToMethodDescriptor(Signature sig) { + StringBuilder sb = new StringBuilder("("); + for (int i = 0; i < sig.getParameterCount(false); ++i) { + sb.append(sig.getParameterType(i, null).getName()); + } + sb.append(')').append(sig.getReturnType(null).getName()); + return sb.toString(); + } + + /** * Formats some profiling information associated as a string. * * @param info the profiling info to format diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Mon Feb 04 06:31:27 2013 -0800 @@ -26,7 +26,7 @@ import java.lang.reflect.*; /** - * Represents a resolved Java types. Types include primitives, objects, {@code void}, and arrays + * Represents a resolved Java type. Types include primitives, objects, {@code void}, and arrays * thereof. Types, like fields and methods, are resolved through {@link ConstantPool constant pools} * . */ diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Signature.java Mon Feb 04 06:31:27 2013 -0800 @@ -86,19 +86,4 @@ * @return the size of the parameters in slots */ int getParameterSlots(boolean withReceiver); - - /** - * Gets the method - * descriptor corresponding to this signature. For example: - * - *
-     * (ILjava/lang/String;D)V
-     * 
- * - * . - * - * @return the signature as a string - */ - String getMethodDescriptor(); } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaField.java Mon Feb 04 06:31:27 2013 -0800 @@ -28,7 +28,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; -import com.oracle.graal.nodes.extended.*; import com.oracle.graal.phases.*; /** @@ -101,12 +100,12 @@ if (receiver == null) { assert Modifier.isStatic(flags); if (holder.isInitialized()) { - return ReadNode.readUnsafeConstant(getKind(), holder.mirror(), offset); + return HotSpotGraalRuntime.getInstance().getRuntime().readUnsafeConstant(getKind(), holder.mirror(), offset); } return null; } else { assert !Modifier.isStatic(flags); - return ReadNode.readUnsafeConstant(getKind(), receiver.asObject(), offset); + return HotSpotGraalRuntime.getInstance().getRuntime().readUnsafeConstant(getKind(), receiver.asObject(), offset); } } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Mon Feb 04 06:31:27 2013 -0800 @@ -52,7 +52,7 @@ private final HotSpotResolvedObjectType holder; private/* final */int codeSize; private/* final */int exceptionHandlerCount; - private Signature signature; + private HotSpotSignature signature; private Boolean hasBalancedMonitors; private Map compilerStorage; private HotSpotMethodData methodData; @@ -162,7 +162,7 @@ } @Override - public Signature getSignature() { + public HotSpotSignature getSignature() { if (signature == null) { signature = new HotSpotSignature(HotSpotGraalRuntime.getInstance().getCompilerToVM().getSignature(metaspaceMethod)); } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Feb 04 06:31:27 2013 -0800 @@ -28,6 +28,7 @@ import static com.oracle.graal.api.code.Register.RegisterFlag.*; import static com.oracle.graal.api.meta.DeoptimizationReason.*; import static com.oracle.graal.api.meta.Value.*; +import static com.oracle.graal.graph.UnsafeAccess.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; import static com.oracle.graal.hotspot.snippets.SystemSubstitutions.*; import static com.oracle.graal.java.GraphBuilderPhase.RuntimeCalls.*; @@ -916,4 +917,30 @@ gcRoots.put(object, object); return object; } + + @Override + public Constant readUnsafeConstant(Kind kind, Object base, long displacement) { + switch (kind) { + case Boolean: + return Constant.forBoolean(base == null ? unsafe.getByte(displacement) != 0 : unsafe.getBoolean(base, displacement)); + case Byte: + return Constant.forByte(base == null ? unsafe.getByte(displacement) : unsafe.getByte(base, displacement)); + case Char: + return Constant.forChar(base == null ? unsafe.getChar(displacement) : unsafe.getChar(base, displacement)); + case Short: + return Constant.forShort(base == null ? unsafe.getShort(displacement) : unsafe.getShort(base, displacement)); + case Int: + return Constant.forInt(base == null ? unsafe.getInt(displacement) : unsafe.getInt(base, displacement)); + case Long: + return Constant.forLong(base == null ? unsafe.getLong(displacement) : unsafe.getLong(base, displacement)); + case Float: + return Constant.forFloat(base == null ? unsafe.getFloat(displacement) : unsafe.getFloat(base, displacement)); + case Double: + return Constant.forDouble(base == null ? unsafe.getDouble(displacement) : unsafe.getDouble(base, displacement)); + case Object: + return Constant.forObject(unsafe.getObject(base, displacement)); + default: + throw GraalInternalError.shouldNotReachHere(); + } + } } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java Mon Feb 04 06:31:27 2013 -0800 @@ -124,8 +124,8 @@ return type; } - @Override public String getMethodDescriptor() { + assert originalString.equals(MetaUtil.signatureToMethodDescriptor(this)); return originalString; } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Mon Feb 04 06:31:27 2013 -0800 @@ -58,6 +58,12 @@ this.location = location; } + public AccessNode(ValueNode object, ValueNode location, Stamp stamp, ValueNode... dependencies) { + super(stamp, dependencies); + this.object = object; + this.location = location; + } + @Override public Node node() { return this; diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Feb 04 06:31:27 2013 -0800 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import static com.oracle.graal.graph.FieldIntrospection.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -42,11 +41,12 @@ super(object, object.graph().add(new LocationNode(locationIdentity, kind, displacement)), StampFactory.forKind(kind)); } - private ReadNode(ValueNode object, ValueNode location) { - // Used by node intrinsics. Since the initial value for location is a parameter, i.e., a - // LocalNode, the - // constructor cannot use the declared type LocationNode - this(object, location, StampFactory.forNodeIntrinsic()); + private ReadNode(ValueNode object, ValueNode location, ValueNode dependency) { + /* + * Used by node intrinsics. Since the initial value for location is a parameter, i.e., a + * LocalNode, the constructor cannot use the declared type LocationNode. + */ + super(object, location, StampFactory.forNodeIntrinsic(), dependency); } @Override @@ -59,60 +59,27 @@ return canonicalizeRead(this, tool); } - /** - * Utility function for reading a value of this kind using a base address and a displacement. - * - * @param base the base address from which the value is read - * @param displacement the displacement within the object in bytes - * @return the read value encapsulated in a {@link Constant} object - */ - public static Constant readUnsafeConstant(Kind kind, Object base, long displacement) { - switch (kind) { - case Boolean: - return Constant.forBoolean(base == null ? unsafe.getByte(displacement) != 0 : unsafe.getBoolean(base, displacement)); - case Byte: - return Constant.forByte(base == null ? unsafe.getByte(displacement) : unsafe.getByte(base, displacement)); - case Char: - return Constant.forChar(base == null ? unsafe.getChar(displacement) : unsafe.getChar(base, displacement)); - case Short: - return Constant.forShort(base == null ? unsafe.getShort(displacement) : unsafe.getShort(base, displacement)); - case Int: - return Constant.forInt(base == null ? unsafe.getInt(displacement) : unsafe.getInt(base, displacement)); - case Long: - return Constant.forLong(base == null ? unsafe.getLong(displacement) : unsafe.getLong(base, displacement)); - case Float: - return Constant.forFloat(base == null ? unsafe.getFloat(displacement) : unsafe.getFloat(base, displacement)); - case Double: - return Constant.forDouble(base == null ? unsafe.getDouble(displacement) : unsafe.getDouble(base, displacement)); - case Object: - return Constant.forObject(unsafe.getObject(base, displacement)); - default: - throw GraalInternalError.shouldNotReachHere(); - } - } - public static ValueNode canonicalizeRead(Access read, CanonicalizerTool tool) { MetaAccessProvider runtime = tool.runtime(); - if (runtime != null && read.object() != null && read.object().isConstant()/* - * && - * read.object() - * .kind() == - * Kind.Object - */) { + if (runtime != null && read.object() != null && read.object().isConstant()) { if (read.location().locationIdentity() == LocationNode.FINAL_LOCATION && read.location().getClass() == LocationNode.class) { long displacement = read.location().displacement(); Kind kind = read.location().getValueKind(); if (read.object().kind() == Kind.Object) { Object base = read.object().asConstant().asObject(); if (base != null) { - Constant constant = readUnsafeConstant(kind, base, displacement); - return ConstantNode.forConstant(constant, runtime, read.node().graph()); + Constant constant = tool.runtime().readUnsafeConstant(kind, base, displacement); + if (constant != null) { + return ConstantNode.forConstant(constant, runtime, read.node().graph()); + } } } else if (read.object().kind() == Kind.Long || read.object().kind().getStackKind() == Kind.Int) { long base = read.object().asConstant().asLong(); if (base != 0L) { - Constant constant = readUnsafeConstant(kind, null, base + displacement); - return ConstantNode.forConstant(constant, runtime, read.node().graph()); + Constant constant = tool.runtime().readUnsafeConstant(kind, null, base + displacement); + if (constant != null) { + return ConstantNode.forConstant(constant, runtime, read.node().graph()); + } } } } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ComputeProbabilityPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ComputeProbabilityPhase.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ComputeProbabilityPhase.java Mon Feb 04 06:31:27 2013 -0800 @@ -419,14 +419,14 @@ Node current = scopeStart; while (current != null) { - if (current instanceof ControlSplitNode) { + if (current.successors().count() > 1) { + assert current instanceof ControlSplitNode; ControlSplitNode controlSplit = (ControlSplitNode) current; current = getMaxProbabilitySux(controlSplit); if (((FixedNode) current).probability() < minPathProbability) { minPathProbability = ((FixedNode) current).probability(); } } else { - assert current.successors().count() <= 1; current = current.successors().first(); } } diff -r d19837d236e5 -r 20cc221ed5ca graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/ClassSubstitution.java Mon Feb 04 06:31:27 2013 -0800 @@ -77,7 +77,8 @@ boolean isStatic() default true; /** - * Gets the {@linkplain Signature#getMethodDescriptor() signature} of the original method. + * Gets the {@linkplain MetaUtil#signatureToMethodDescriptor signature} of the original + * method. *

* If the default value is specified for this element, then the signature of the original * method is the same as the substitute method. @@ -110,7 +111,7 @@ boolean isStatic() default true; /** - * Gets the {@linkplain Signature#getMethodDescriptor() signature} of the substituted + * Gets the {@linkplain MetaUtil#signatureToMethodDescriptor signature} of the substituted * method. *

* If the default value is specified for this element, then the signature of the substituted diff -r d19837d236e5 -r 20cc221ed5ca 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 Mon Feb 04 13:21:13 2013 +0100 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Mon Feb 04 06:31:27 2013 -0800 @@ -284,7 +284,19 @@ } public boolean isWord(ValueNode node) { + /* + * If we already know that we have a word type, we do not need to infer the stamp. This + * avoids exceptions in inferStamp when the inputs have already been rewritten to word, + * i.e., when the expected input is no longer an object. + */ + if (isWord0(node)) { + return true; + } node.inferStamp(); + return isWord0(node); + } + + private boolean isWord0(ValueNode node) { if (node.stamp() == StampFactory.forWord()) { return true; }