# HG changeset patch # User Lukas Stadler # Date 1375893375 -7200 # Node ID fe5ce6520b6c0a7ccab9a76b1d817bc0926010e7 # Parent 80c0b5c2ec082e20b210c743140ce60ea53bdb20 macro node for NodeClass.get(Class) diff -r 80c0b5c2ec08 -r fe5ce6520b6c graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java Wed Aug 07 18:35:59 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeClassSubstitutions.java Wed Aug 07 18:36:15 2013 +0200 @@ -25,7 +25,10 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.nodes.*; /** * Substitutions for improving the performance of some critical methods in {@link NodeClass} @@ -37,6 +40,26 @@ @ClassSubstitution(NodeClass.class) public class NodeClassSubstitutions { + /** + * A macro node for calls to {@link NodeClass#get(Class)}. It can use the compiler's knowledge + * about node classes to replace itself with a constant value for a constant {@link Class} + * parameter. + */ + public static class NodeClassGetNode extends PureFunctionMacroNode { + + public NodeClassGetNode(Invoke invoke) { + super(invoke); + } + + @Override + protected Constant evaluate(Constant param, MetaAccessProvider metaAccess) { + return Constant.forObject(NodeClass.get((Class) param.asObject())); + } + } + + @MacroSubstitution(isStatic = true, forced = true, macro = NodeClassGetNode.class) + private static native NodeClass get(Class c); + @MethodSubstitution private static Node getNode(Node node, long offset) { return UnsafeCastNode.unsafeCast(UnsafeLoadNode.load(node, 0, offset, Kind.Object), Node.class, false, false);