# HG changeset patch # User Doug Simon # Date 1429102068 -7200 # Node ID 09d9141cf7d81808828d28d590a2768c6d3af35d # Parent a671d592a8da6877fdb5296b24f1ffae3f6bd947 converted @MethodSubstitutions for java.lang.Class to MethodSubstitutionPlugins and removed ClassQueryNode since substitutions can now be canonicalized (since non-null KlassPointers can now be optimized) diff -r a671d592a8da -r 09d9141cf7d8 graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/MethodSubstitutionPlugin.java --- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/MethodSubstitutionPlugin.java Tue Apr 21 01:27:08 2015 +0200 +++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/MethodSubstitutionPlugin.java Wed Apr 15 14:47:48 2015 +0200 @@ -41,9 +41,22 @@ public final class MethodSubstitutionPlugin implements InvocationPlugin { private ResolvedJavaMethod cachedSubstitute; + + /** + * The class in which the substitute method is declared. + */ private final Class declaringClass; + + /** + * The name of the original and substitute method. + */ private final String name; + + /** + * The parameter types of the substitute method. + */ private final Class[] parameters; + private final boolean originalIsStatic; /** @@ -62,6 +75,20 @@ this.originalIsStatic = parameters.length == 0 || parameters[0] != Receiver.class; } + /** + * Creates a method substitution plugin. + * + * @param declaringClass the class in which the substitute method is declared + * @param name the name of the substitute method + * @param parameters the parameter types of the substitute method + */ + public MethodSubstitutionPlugin(boolean originalIsStatic, Class declaringClass, String name, Class... parameters) { + this.declaringClass = declaringClass; + this.name = name; + this.parameters = parameters; + this.originalIsStatic = originalIsStatic; + } + public boolean inlineOnly() { // Conservatively assume MacroNodes may be used in a substitution return true; diff -r a671d592a8da -r 09d9141cf7d8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Tue Apr 21 01:27:08 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Wed Apr 15 14:47:48 2015 +0200 @@ -38,7 +38,6 @@ import com.oracle.graal.graphbuilderconf.MethodIdMap.Receiver; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.ClassQueryNode.Query; import com.oracle.graal.hotspot.replacements.*; import com.oracle.graal.hotspot.replacements.arraycopy.*; import com.oracle.graal.hotspot.word.*; @@ -79,7 +78,7 @@ plugins.setGenericInvocationPlugin(new DefaultGenericInvocationPlugin(metaAccess, nodeIntrinsification, wordOperationPlugin)); registerObjectPlugins(invocationPlugins); - registerClassPlugins(invocationPlugins); + registerClassPlugins(plugins); registerSystemPlugins(invocationPlugins, foreignCalls); registerThreadPlugins(invocationPlugins, metaAccess, wordTypes, config); registerCallSitePlugins(invocationPlugins); @@ -107,27 +106,16 @@ r.registerMethodSubstitution(ObjectSubstitutions.class, "hashCode", Receiver.class); } - private static void registerClassPlugins(InvocationPlugins plugins) { - Registration r = new Registration(plugins, Class.class); + private static void registerClassPlugins(Plugins plugins) { + Registration r = new Registration(plugins.getInvocationPlugins(), Class.class); - for (Query query : Query.values()) { - r.register1(query.name(), Receiver.class, new InvocationPlugin() { - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - ValueNode javaClass = receiver.get(); - ValueNode folded = ClassQueryNode.tryFold(GraphUtil.originalValue(javaClass), query, b.getMetaAccess(), b.getConstantReflection()); - if (folded != null) { - b.addPush(query.returnKind, folded); - } else { - b.addPush(query.returnKind, new ClassQueryNode(b.getInvokeKind(), targetMethod, query, b.bci(), b.getInvokeReturnType(), javaClass)); - } - return true; - } + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "getModifiers", Receiver.class); + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "isInterface", Receiver.class); + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "isArray", Receiver.class); + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "isPrimitive", Receiver.class); + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "getSuperclass", Receiver.class); + r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "getComponentType", Receiver.class); - public boolean inlineOnly() { - return true; - } - }); - } r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { ValueNode javaClass = receiver.get(); diff -r a671d592a8da -r 09d9141cf7d8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassQueryNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassQueryNode.java Tue Apr 21 01:27:08 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.hotspot.nodes; - -import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.common.*; -import com.oracle.graal.graph.*; -import com.oracle.graal.graph.spi.*; -import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.nodeinfo.*; -import com.oracle.graal.nodes.CallTargetNode.InvokeKind; -import com.oracle.graal.nodes.*; -import com.oracle.graal.replacements.nodes.*; - -/** - * {@link MacroNode Macro node} for some basic query methods in {@link Class}. - */ -@NodeInfo -public final class ClassQueryNode extends MacroStateSplitNode implements Canonicalizable { - - /** - * The query methods in {@link Class} supported by {@link ClassQueryNode}. - */ - public enum Query { - getClassLoader0(Kind.Object), - getComponentType(Kind.Object), - getSuperclass(Kind.Object), - getModifiers(Kind.Int), - isArray(Kind.Boolean), - isInterface(Kind.Boolean), - isPrimitive(Kind.Boolean); - - private Query(Kind returnKind) { - this.returnKind = returnKind; - } - - public final Kind returnKind; - } - - public static final NodeClass TYPE = NodeClass.create(ClassQueryNode.class); - - protected final Query query; - - public ClassQueryNode(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, Query query, int bci, JavaType returnType, ValueNode receiver) { - super(TYPE, invokeKind, targetMethod, bci, returnType, receiver); - this.query = query; - assert query.returnKind == targetMethod.getSignature().getReturnKind(); - } - - private ValueNode getJavaClass() { - return arguments.get(0); - } - - @Override - public Node canonical(CanonicalizerTool tool) { - ValueNode value = tryFold(getJavaClass(), query, tool.getMetaAccess(), tool.getConstantReflection()); - return value == null ? this : value; - } - - public static ValueNode tryFold(ValueNode javaClass, Query query, MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection) { - if (javaClass != null && javaClass.isConstant()) { - if (query.returnKind == Kind.Object) { - if (GraalOptions.ImmutableCode.getValue()) { - return null; - } - HotSpotObjectConstant c = (HotSpotObjectConstant) javaClass.asConstant(); - JavaConstant answer; - switch (query) { - case getClassLoader0: - answer = c.getClassLoader(); - break; - case getComponentType: - answer = c.getComponentType(); - break; - case getSuperclass: - answer = c.getSuperclass(); - break; - default: - GraalInternalError.shouldNotReachHere(); - answer = null; - } - if (answer != null) { - return ConstantNode.forConstant(answer, metaAccess); - } - } else { - ResolvedJavaType type = constantReflection.asJavaType(javaClass.asConstant()); - if (type != null) { - switch (query) { - case isArray: - return ConstantNode.forBoolean(type.isArray()); - case isPrimitive: - return ConstantNode.forBoolean(type.isPrimitive()); - case isInterface: - return ConstantNode.forBoolean(type.isInterface()); - case getModifiers: - return ConstantNode.forInt(type.getModifiers()); - default: - GraalInternalError.shouldNotReachHere(); - } - } - } - } - return null; - } -} diff -r a671d592a8da -r 09d9141cf7d8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotClassSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotClassSubstitutions.java Tue Apr 21 01:27:08 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotClassSubstitutions.java Wed Apr 15 14:47:48 2015 +0200 @@ -26,7 +26,6 @@ import java.lang.reflect.*; -import com.oracle.graal.api.replacements.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; import com.oracle.graal.word.*; @@ -34,10 +33,8 @@ /** * Substitutions for {@link java.lang.Class} methods. */ -@ClassSubstitution(java.lang.Class.class) public class HotSpotClassSubstitutions { - @MethodSubstitution(isStatic = false, forced = true) public static int getModifiers(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); if (klass.isNull()) { @@ -48,7 +45,6 @@ } } - @MethodSubstitution(isStatic = false, forced = true) public static boolean isInterface(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); if (klass.isNull()) { @@ -59,7 +55,6 @@ } } - @MethodSubstitution(isStatic = false, forced = true) public static boolean isArray(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); if (klass.isNull()) { @@ -69,15 +64,11 @@ } } - @MethodSubstitution(isStatic = false, forced = true) public static boolean isPrimitive(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); return klass.isNull(); } - public static native ClassLoader getClassLoader0(Class thisObj); - - @MethodSubstitution(isStatic = false) public static Class getSuperclass(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); if (!klass.isNull()) { @@ -102,7 +93,6 @@ return PiNode.asNonNullClass(klass.readObject(classMirrorOffset(), CLASS_MIRROR_LOCATION)); } - @MethodSubstitution(isStatic = false) public static Class getComponentType(final Class thisObj) { KlassPointer klass = ClassGetHubNode.readClass(thisObj); if (!klass.isNull()) { diff -r a671d592a8da -r 09d9141cf7d8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotSubstitutions.java Tue Apr 21 01:27:08 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotSubstitutions.java Wed Apr 15 14:47:48 2015 +0200 @@ -43,7 +43,6 @@ replacements.registerSubstitutions(System.class, SystemSubstitutions.class); replacements.registerSubstitutions(Thread.class, ThreadSubstitutions.class); replacements.registerSubstitutions(Unsafe.class, UnsafeSubstitutions.class); - replacements.registerSubstitutions(Class.class, HotSpotClassSubstitutions.class); replacements.registerSubstitutions(CRC32.class, CRC32Substitutions.class); replacements.registerSubstitutions(Reflection.class, ReflectionSubstitutions.class); replacements.registerSubstitutions(CompilerToVMImpl.class, CompilerToVMImplSubstitutions.class);