# HG changeset patch # User Thomas Wuerthinger # Date 1423105859 -3600 # Node ID bb25b153433c36dada50dce342e12f3fc21183ef # Parent 183f7d3a93e55a113ff8bc297f7cc4cec42813bc Add constant folding for getClass graph builder plugin. diff -r 183f7d3a93e5 -r bb25b153433c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java Thu Feb 05 03:42:42 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java Thu Feb 05 04:10:59 2015 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; +import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderPlugins.InvocationPlugin; import com.oracle.graal.java.GraphBuilderPlugins.Registration; @@ -41,10 +42,16 @@ Registration r = new Registration(plugins, metaAccess, Object.class); r.register1("getClass", Receiver.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext builder, ValueNode rcvr) { - GuardingPiNode pi = builder.append(new GuardingPiNode(rcvr)); - StampProvider stampProvider = builder.getStampProvider(); - LoadHubNode hub = builder.append(new LoadHubNode(stampProvider, pi)); - HubGetClassNode mirror = builder.append(new HubGetClassNode(builder.getMetaAccess(), hub)); + ObjectStamp objectStamp = (ObjectStamp) rcvr.stamp(); + ValueNode mirror; + if (objectStamp.isExactType() && objectStamp.nonNull()) { + mirror = builder.append(ConstantNode.forConstant(objectStamp.type().getJavaClass(), metaAccess)); + } else { + GuardingPiNode pi = builder.append(new GuardingPiNode(rcvr)); + StampProvider stampProvider = builder.getStampProvider(); + LoadHubNode hub = builder.append(new LoadHubNode(stampProvider, pi)); + mirror = builder.append(new HubGetClassNode(builder.getMetaAccess(), hub)); + } builder.push(Kind.Object, mirror); return true; }