changeset 19880:3cc8aa066ed3

made resolution of method with InvocationPlugins lazy
author Doug Simon <doug.simon@oracle.com>
date Thu, 12 Mar 2015 22:10:07 +0100
parents 52c9b1959f95
children 6a684aeb1590
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FinalizableSubclassTest.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/tutorial/StaticAnalysis.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInvocationPlugins.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/SnippetStub.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java graal/com.oracle.graal.java/src/com/oracle/graal/java/InvocationPlugins.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/ExactMathTest.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java
diffstat 14 files changed, 227 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java	Thu Mar 12 22:10:07 2015 +0100
@@ -42,6 +42,7 @@
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.java.*;
+import com.oracle.graal.java.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
@@ -68,7 +69,9 @@
         MetaAccessProvider metaAccess = providers.getMetaAccess();
 
         PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
-        graphBuilderSuite.appendPhase(new GraphBuilderPhase(GraphBuilderConfiguration.getEagerDefault()));
+        GraphBuilderConfiguration config = GraphBuilderConfiguration.getEagerDefault();
+        config.setPlugins(new Plugins(metaAccess));
+        graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
         HighTierContext context = new HighTierContext(providers, null, graphBuilderSuite, OptimisticOptimizations.NONE);
 
         Assume.assumeTrue(VerifyPhase.class.desiredAssertionStatus());
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FinalizableSubclassTest.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FinalizableSubclassTest.java	Thu Mar 12 22:10:07 2015 +0100
@@ -28,11 +28,12 @@
 
 import org.junit.*;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.meta.Assumptions.Assumption;
 import com.oracle.graal.api.meta.Assumptions.NoFinalizableSubclass;
-import com.oracle.graal.api.meta.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.java.*;
+import com.oracle.graal.java.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
 import com.oracle.graal.nodes.java.*;
@@ -67,6 +68,7 @@
         StructuredGraph graph = new StructuredGraph(javaMethod, allowAssumptions);
 
         GraphBuilderConfiguration conf = GraphBuilderConfiguration.getSnippetDefault();
+        conf.setPlugins(new Plugins(getMetaAccess()));
         new GraphBuilderPhase.Instance(getMetaAccess(), getProviders().getStampProvider(), getProviders().getConstantReflection(), conf, OptimisticOptimizations.ALL, null).apply(graph);
         HighTierContext context = new HighTierContext(getProviders(), null, getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL);
         new InliningPhase(new CanonicalizerPhase()).apply(graph, context);
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/tutorial/StaticAnalysis.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/tutorial/StaticAnalysis.java	Thu Mar 12 22:10:07 2015 +0100
@@ -30,6 +30,7 @@
 import com.oracle.graal.debug.Debug.Scope;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.java.*;
+import com.oracle.graal.java.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
@@ -237,6 +238,7 @@
                      */
                     OptimisticOptimizations optimisticOpts = OptimisticOptimizations.NONE;
 
+                    graphBuilderConfig.setPlugins(new Plugins(metaAccess));
                     GraphBuilderPhase.Instance graphBuilder = new GraphBuilderPhase.Instance(metaAccess, stampProvider, null, graphBuilderConfig, optimisticOpts, null);
                     graphBuilder.apply(graph);
                 } catch (Throwable ex) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Thu Mar 12 22:10:07 2015 +0100
@@ -36,7 +36,7 @@
 import com.oracle.graal.java.*;
 import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin;
 import com.oracle.graal.java.InvocationPlugins.Registration;
-import com.oracle.graal.java.InvocationPlugins.Registration.Receiver;
+import com.oracle.graal.java.InvocationPlugins.Receiver;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.HeapAccess.BarrierType;
 import com.oracle.graal.nodes.extended.*;
@@ -70,16 +70,16 @@
         plugins.setInlineInvokePlugin(new HotSpotInlineInvokePlugin(nodeIntrinsification, (ReplacementsImpl) providers.getReplacements()));
         plugins.setGenericInvocationPlugin(new DefaultGenericInvocationPlugin(nodeIntrinsification, wordOperationPlugin));
 
-        registerObjectPlugins(invocationPlugins, metaAccess);
-        registerSystemPlugins(invocationPlugins, metaAccess, providers.getForeignCalls());
+        registerObjectPlugins(invocationPlugins);
+        registerSystemPlugins(invocationPlugins, providers.getForeignCalls());
         registerThreadPlugins(invocationPlugins, metaAccess, wordTypes, config);
-        registerStableOptionPlugins(invocationPlugins, metaAccess);
+        registerStableOptionPlugins(invocationPlugins);
         StandardGraphBuilderPlugins.registerInvocationPlugins(providers.getMetaAccess(), providers.getCodeCache().target.arch, invocationPlugins, !config.useHeapProfiler);
         return plugins;
     }
 
-    private static void registerObjectPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess) {
-        Registration r = new Registration(plugins, metaAccess, Object.class);
+    private static void registerObjectPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Object.class);
         r.register1("getClass", Receiver.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode rcvr) {
                 ObjectStamp objectStamp = (ObjectStamp) rcvr.stamp();
@@ -97,8 +97,8 @@
         });
     }
 
-    private static void registerSystemPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls) {
-        Registration r = new Registration(plugins, metaAccess, System.class);
+    private static void registerSystemPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) {
+        Registration r = new Registration(plugins, System.class);
         r.register0("currentTimeMillis", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
                 b.push(Kind.Long, b.append(new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_MILLIS, StampFactory.forKind(Kind.Long))));
@@ -114,7 +114,7 @@
     }
 
     private static void registerThreadPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess, WordTypes wordTypes, HotSpotVMConfig config) {
-        Registration r = new Registration(plugins, metaAccess, Thread.class);
+        Registration r = new Registration(plugins, Thread.class);
         r.register0("currentThread", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
                 CurrentJavaThreadNode thread = b.append(new CurrentJavaThreadNode(wordTypes.getWordKind()));
@@ -129,8 +129,8 @@
         });
     }
 
-    private static void registerStableOptionPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess) {
-        Registration r = new Registration(plugins, metaAccess, StableOptionValue.class);
+    private static void registerStableOptionPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, StableOptionValue.class);
         r.register1("getValue", Receiver.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode rcvr) {
                 if (rcvr.isConstant() && !rcvr.isNullConstant()) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInvocationPlugins.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInvocationPlugins.java	Thu Mar 12 22:10:07 2015 +0100
@@ -24,39 +24,38 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.hotspot.*;
+import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin;
 import com.oracle.graal.java.*;
-import com.oracle.graal.java.GraphBuilderPlugin.*;
-import com.oracle.graal.replacements.StandardGraphBuilderPlugins.*;
+import com.oracle.graal.replacements.StandardGraphBuilderPlugins.BoxPlugin;
 
 /**
  * Extension of {@link InvocationPlugins} that disables plugins based on runtime configuration.
  */
 final class HotSpotInvocationPlugins extends InvocationPlugins {
     final HotSpotVMConfig config;
-    final MetaAccessProvider metaAccess;
 
     public HotSpotInvocationPlugins(HotSpotVMConfig config, MetaAccessProvider metaAccess) {
+        super(metaAccess);
         this.config = config;
-        this.metaAccess = metaAccess;
     }
 
     @Override
-    public void register(ResolvedJavaMethod method, InvocationPlugin plugin) {
+    public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
         if (!config.usePopCountInstruction) {
-            if (method.getName().equals("bitCount")) {
-                assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class)) || method.getDeclaringClass().equals(metaAccess.lookupJavaType(Long.class));
+            if (name.equals("bitCount")) {
+                assert declaringClass.equals(Integer.class) || declaringClass.equals(Long.class);
                 return;
             }
         }
         if (!config.useCountLeadingZerosInstruction) {
-            if (method.getName().equals("numberOfLeadingZeros")) {
-                assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class)) || method.getDeclaringClass().equals(metaAccess.lookupJavaType(Long.class));
+            if (name.equals("numberOfLeadingZeros")) {
+                assert declaringClass.equals(Integer.class) || declaringClass.equals(Long.class);
                 return;
             }
         }
         if (!config.useCountTrailingZerosInstruction) {
-            if (method.getName().equals("numberOfTrailingZeros")) {
-                assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class));
+            if (name.equals("numberOfTrailingZeros")) {
+                assert declaringClass.equals(Integer.class);
                 return;
             }
         }
@@ -67,6 +66,6 @@
                 return;
             }
         }
-        super.register(method, plugin);
+        super.register(plugin, declaringClass, name, argumentTypes);
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/SnippetStub.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/SnippetStub.java	Thu Mar 12 22:10:07 2015 +0100
@@ -79,11 +79,12 @@
 
     @Override
     protected StructuredGraph getGraph() {
-        GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault();
         Plugins defaultPlugins = providers.getGraphBuilderPlugins();
-        Plugins plugins = config.getPlugins().updateFrom(defaultPlugins, false);
+        Plugins plugins = new Plugins(providers.getMetaAccess()).updateFrom(defaultPlugins, false);
         plugins.getInvocationPlugins().setDefaults(defaultPlugins.getInvocationPlugins());
         plugins.setParameterPlugin(new ConstantBindingParameterPlugin(makeConstArgs(), plugins.getParameterPlugin(), providers.getMetaAccess(), providers.getSnippetReflection()));
+        GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault();
+        config.setPlugins(plugins);
 
         // Stubs cannot have optimistic assumptions since they have
         // to be valid for the entire run of the VM. Nor can they be
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java	Thu Mar 12 22:10:07 2015 +0100
@@ -45,8 +45,8 @@
         private GenericInvocationPlugin genericInvocationPlugin;
         private LoopExplosionPlugin loopExplosionPlugin;
 
-        public Plugins() {
-            invocationPlugins = new InvocationPlugins();
+        public Plugins(MetaAccessProvider metaAccess) {
+            invocationPlugins = new InvocationPlugins(metaAccess);
         }
 
         public Plugins(InvocationPlugins invocationPlugins) {
@@ -127,7 +127,7 @@
     private final DebugInfoMode debugInfoMode;
     private final boolean doLivenessAnalysis;
     private boolean useProfiling;
-    private Plugins plugins = new Plugins();
+    private Plugins plugins;
 
     public static enum DebugInfoMode {
         SafePointsOnly,
@@ -252,7 +252,12 @@
     }
 
     public GraphBuilderConfiguration copyPluginsFrom(GraphBuilderConfiguration other) {
-        this.plugins.updateFrom(other.plugins, true);
+        if (other.plugins != null) {
+            if (this.plugins == null) {
+                this.plugins = new Plugins(other.plugins.getInvocationPlugins().getMetaAccess());
+            }
+            this.plugins.updateFrom(other.plugins, true);
+        }
         return this;
     }
 }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/InvocationPlugins.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/InvocationPlugins.java	Thu Mar 12 22:10:07 2015 +0100
@@ -37,25 +37,26 @@
  * Manages a set of {@link InvocationPlugin}s.
  */
 public class InvocationPlugins {
+
     /**
-     * Utility for {@linkplain InvocationPlugins#register(ResolvedJavaMethod, InvocationPlugin)
+     * Sentinel class for use with
+     * {@link InvocationPlugins#register(InvocationPlugin, Class, String, Class...)} to denote the
+     * receiver argument for a non-static method.
+     */
+    public static final class Receiver {
+        private Receiver() {
+            throw GraalInternalError.shouldNotReachHere();
+        }
+    }
+
+    /**
+     * Utility for
+     * {@linkplain InvocationPlugins#register(InvocationPlugin, Class, String, Class...)
      * registration} of invocation plugins.
      */
     public static class Registration {
 
-        /**
-         * Sentinel class for use with {@link Registration#register1},
-         * {@link Registration#register2} or {@link Registration#register3} to denote the receiver
-         * argument for a non-static method.
-         */
-        public static final class Receiver {
-            private Receiver() {
-                throw GraalInternalError.shouldNotReachHere();
-            }
-        }
-
         private final InvocationPlugins plugins;
-        private final MetaAccessProvider metaAccess;
         private final Class<?> declaringClass;
 
         /**
@@ -63,13 +64,11 @@
          * given class.
          *
          * @param plugins where to register the plugins
-         * @param metaAccess used to resolve classes and methods
          * @param declaringClass the class declaring the methods for which plugins will be
          *            registered via this object
          */
-        public Registration(InvocationPlugins plugins, MetaAccessProvider metaAccess, Class<?> declaringClass) {
+        public Registration(InvocationPlugins plugins, Class<?> declaringClass) {
             this.plugins = plugins;
-            this.metaAccess = metaAccess;
             this.declaringClass = declaringClass;
         }
 
@@ -80,7 +79,7 @@
          * @param plugin the plugin to be registered
          */
         public void register0(String name, InvocationPlugin plugin) {
-            plugins.register(resolve(metaAccess, declaringClass, name), plugin);
+            plugins.register(plugin, declaringClass, name);
         }
 
         /**
@@ -90,7 +89,7 @@
          * @param plugin the plugin to be registered
          */
         public void register1(String name, Class<?> arg, InvocationPlugin plugin) {
-            plugins.register(arg == Receiver.class ? resolve(metaAccess, declaringClass, name) : resolve(metaAccess, declaringClass, name, arg), plugin);
+            plugins.register(plugin, declaringClass, name, arg);
         }
 
         /**
@@ -100,7 +99,7 @@
          * @param plugin the plugin to be registered
          */
         public void register2(String name, Class<?> arg1, Class<?> arg2, InvocationPlugin plugin) {
-            plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2) : resolve(metaAccess, declaringClass, name, arg1, arg2), plugin);
+            plugins.register(plugin, declaringClass, name, arg1, arg2);
         }
 
         /**
@@ -110,7 +109,7 @@
          * @param plugin the plugin to be registered
          */
         public void register3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) {
-            plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3), plugin);
+            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3);
         }
 
         /**
@@ -120,7 +119,7 @@
          * @param plugin the plugin to be registered
          */
         public void register4(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, InvocationPlugin plugin) {
-            plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3, arg4) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3, arg4), plugin);
+            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4);
         }
 
         /**
@@ -130,37 +129,91 @@
          * @param plugin the plugin to be registered
          */
         public void register5(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, Class<?> arg5, InvocationPlugin plugin) {
-            plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3, arg4, arg5) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3, arg4, arg5),
-                            plugin);
+            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4, arg5);
+        }
+    }
+
+    public static final class MethodInfo {
+        public final boolean isStatic;
+        public final Class<?> declaringClass;
+        public final String name;
+        public final Class<?>[] argumentTypes;
+
+        public MethodInfo(Class<?> declaringClass, String name, Class<?>... argumentTypes) {
+            this.isStatic = argumentTypes.length == 0 || argumentTypes[0] != Receiver.class;
+            this.declaringClass = declaringClass;
+            this.name = name;
+            this.argumentTypes = argumentTypes;
         }
 
-        /**
-         * Resolves a method given a declaring class, name and parameter types.
-         */
-        public static ResolvedJavaMethod resolve(MetaAccessProvider metaAccess, Class<?> declaringClass, String name, Class<?>... parameterTypes) {
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof MethodInfo) {
+                MethodInfo that = (MethodInfo) obj;
+                boolean res = this.declaringClass == that.declaringClass && this.name.equals(that.name) && Arrays.equals(this.argumentTypes, that.argumentTypes);
+                assert !res || this.isStatic == that.isStatic;
+                return res;
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            // Replay compilation mandates use of stable hash codes
+            return declaringClass.getName().hashCode() ^ name.hashCode();
+        }
+
+        public ResolvedJavaMethod resolve(MetaAccessProvider metaAccess) {
             try {
-                return metaAccess.lookupJavaMethod(name.equals("<init>") ? declaringClass.getDeclaredConstructor(parameterTypes) : declaringClass.getDeclaredMethod(name, parameterTypes));
+                Class<?>[] parameterTypes = isStatic ? argumentTypes : Arrays.copyOfRange(argumentTypes, 1, argumentTypes.length);
+                ResolvedJavaMethod resolved;
+                if (name.equals("<init>")) {
+                    resolved = metaAccess.lookupJavaMethod(declaringClass.getDeclaredConstructor(parameterTypes));
+                } else {
+                    resolved = metaAccess.lookupJavaMethod(declaringClass.getDeclaredMethod(name, parameterTypes));
+                }
+                assert resolved.isStatic() == isStatic;
+                return resolved;
             } catch (NoSuchMethodException | SecurityException e) {
                 throw new GraalInternalError(e);
             }
         }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(declaringClass.getName()).append('.').append(name).append('(');
+            for (Class<?> p : argumentTypes) {
+                if (sb.charAt(sb.length() - 1) != '(') {
+                    sb.append(", ");
+                }
+                sb.append(p.getSimpleName());
+            }
+            return sb.append(')').toString();
+        }
     }
 
-    private final Map<ResolvedJavaMethod, InvocationPlugin> plugins = new HashMap<>();
+    protected final MetaAccessProvider metaAccess;
+    private final Map<MethodInfo, InvocationPlugin> registrations = new HashMap<>();
+    private volatile Map<ResolvedJavaMethod, InvocationPlugin> plugins;
 
     /**
      * The invocation plugins deferred to if a plugin is not found in this object.
      */
     private InvocationPlugins defaults;
 
+    public InvocationPlugins(MetaAccessProvider metaAccess) {
+        this.metaAccess = metaAccess;
+    }
+
     /**
      * Registers an invocation plugin for a given method. There must be no plugin currently
      * registered for {@code method}.
      */
-    public void register(ResolvedJavaMethod method, InvocationPlugin plugin) {
+    public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
+        MethodInfo method = new MethodInfo(declaringClass, name, argumentTypes);
         assert Checker.check(method, plugin);
-        GraphBuilderPlugin oldValue = plugins.put(method, plugin);
-        // System.out.println("registered: " + plugin);
+        assert plugins == null;
+        GraphBuilderPlugin oldValue = registrations.put(method, plugin);
         assert oldValue == null;
     }
 
@@ -171,6 +224,16 @@
      * @return the plugin associated with {@code method} or {@code null} if none exists
      */
     public InvocationPlugin lookupInvocation(ResolvedJavaMethod method) {
+        if (plugins == null) {
+            synchronized (this) {
+                if (plugins == null) {
+                    plugins = new HashMap<>(registrations.size());
+                    for (Map.Entry<MethodInfo, InvocationPlugin> e : registrations.entrySet()) {
+                        plugins.put(e.getKey().resolve(metaAccess), e.getValue());
+                    }
+                }
+            }
+        }
         InvocationPlugin res = plugins.get(method);
         if (res == null && defaults != null) {
             return defaults.lookupInvocation(method);
@@ -183,6 +246,7 @@
      * plugin is not found in this object.
      */
     public InvocationPlugins setDefaults(InvocationPlugins defaults) {
+        assert defaults != this.defaults;
         InvocationPlugins old = this.defaults;
         this.defaults = defaults;
         return old;
@@ -192,7 +256,7 @@
      * Adds all the plugins from {@code other} to this object.
      */
     public void updateFrom(InvocationPlugins other) {
-        this.plugins.putAll(other.plugins);
+        this.registrations.putAll(other.registrations);
         if (other.defaults != null) {
             updateFrom(other.defaults);
         }
@@ -200,7 +264,7 @@
 
     @Override
     public String toString() {
-        return plugins.keySet().stream().map(m -> m.format("%H.%n(%p)")).collect(Collectors.joining(", ")) + " / defaults: " + this.defaults;
+        return registrations.keySet().stream().map(MethodInfo::toString).collect(Collectors.joining(", ")) + " / defaults: " + this.defaults;
     }
 
     private static class Checker {
@@ -228,9 +292,9 @@
             SIGS = sigs.toArray(new Class<?>[sigs.size()][]);
         }
 
-        public static boolean check(ResolvedJavaMethod method, InvocationPlugin plugin) {
-            int arguments = method.getSignature().getParameterCount(!method.isStatic());
-            assert arguments < SIGS.length : format("need to extend %s to support method with %d arguments: %s", InvocationPlugin.class.getSimpleName(), arguments, method.format("%H.%n(%p)"));
+        public static boolean check(MethodInfo method, InvocationPlugin plugin) {
+            int arguments = method.argumentTypes.length;
+            assert arguments < SIGS.length : format("need to extend %s to support method with %d arguments: %s", InvocationPlugin.class.getSimpleName(), arguments, method);
             for (Method m : plugin.getClass().getDeclaredMethods()) {
                 if (m.getName().equals("apply")) {
                     Class<?>[] parameterTypes = m.getParameterTypes();
@@ -239,7 +303,11 @@
                     }
                 }
             }
-            throw new AssertionError(format("graph builder plugin for %s not found", method.format("%H.%n(%p)")));
+            throw new AssertionError(format("graph builder plugin for %s not found", method));
         }
     }
+
+    public MetaAccessProvider getMetaAccess() {
+        return metaAccess;
+    }
 }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java	Thu Mar 12 22:10:07 2015 +0100
@@ -641,7 +641,8 @@
                     graph.addAfterFixed(graph.start(), graph.add(new ReturnNode(null)));
                 } else {
                     GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault();
-                    Plugins plugins = config.getPlugins().updateFrom(replacements.graphBuilderPlugins, false);
+                    Plugins plugins = new Plugins(metaAccess).updateFrom(replacements.graphBuilderPlugins, false);
+                    config.setPlugins(plugins);
                     plugins.getInvocationPlugins().setDefaults(replacements.graphBuilderPlugins.getInvocationPlugins());
                     if (args != null) {
                         plugins.setParameterPlugin(new ConstantBindingParameterPlugin(args, plugins.getParameterPlugin(), metaAccess, replacements.snippetReflection));
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Thu Mar 12 22:10:07 2015 +0100
@@ -34,8 +34,8 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.java.*;
 import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin;
+import com.oracle.graal.java.InvocationPlugins.Receiver;
 import com.oracle.graal.java.InvocationPlugins.Registration;
-import com.oracle.graal.java.InvocationPlugins.Registration.Receiver;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.debug.*;
@@ -57,29 +57,29 @@
     // @formatter:on
 
     public static void registerInvocationPlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins, boolean useBoxingPlugins) {
-        registerObjectPlugins(metaAccess, plugins);
-        registerClassPlugins(metaAccess, plugins);
-        registerMathPlugins(metaAccess, arch, plugins);
-        registerUnsignedMathPlugins(metaAccess, plugins);
-        registerCharacterPlugins(metaAccess, plugins);
-        registerShortPlugins(metaAccess, plugins);
-        registerIntegerLongPlugins(metaAccess, plugins, Kind.Int);
-        registerIntegerLongPlugins(metaAccess, plugins, Kind.Long);
-        registerFloatPlugins(metaAccess, plugins);
-        registerDoublePlugins(metaAccess, plugins);
-        registerUnsafePlugins(metaAccess, arch, plugins);
+        registerObjectPlugins(plugins);
+        registerClassPlugins(plugins);
+        registerMathPlugins(arch, plugins);
+        registerUnsignedMathPlugins(plugins);
+        registerCharacterPlugins(plugins);
+        registerShortPlugins(plugins);
+        registerIntegerLongPlugins(plugins, Kind.Int);
+        registerIntegerLongPlugins(plugins, Kind.Long);
+        registerFloatPlugins(plugins);
+        registerDoublePlugins(plugins);
+        registerUnsafePlugins(arch, plugins);
         registerEdgesPlugins(metaAccess, plugins);
-        registerGraalDirectivesPlugins(metaAccess, plugins);
+        registerGraalDirectivesPlugins(plugins);
         if (useBoxingPlugins) {
-            registerBoxingPlugins(metaAccess, plugins);
+            registerBoxingPlugins(plugins);
         }
         if (Options.UseBlackholeSubstitution.getValue()) {
-            registerJMHBlackholePlugins(metaAccess, plugins);
+            registerJMHBlackholePlugins(plugins);
         }
     }
 
-    private static void registerUnsafePlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Unsafe.class);
+    private static void registerUnsafePlugins(Architecture arch, InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Unsafe.class);
         for (Kind kind : Kind.values()) {
             if ((kind.isPrimitive() && kind != Kind.Void) || kind == Kind.Object) {
                 Class<?> javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass();
@@ -141,10 +141,10 @@
         return arch.getName().equals("AMD64");
     }
 
-    private static void registerIntegerLongPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins, Kind kind) {
+    private static void registerIntegerLongPlugins(InvocationPlugins plugins, Kind kind) {
         Class<?> declaringClass = kind.toBoxedJavaClass();
         Class<?> type = kind.toJavaClass();
-        Registration r = new Registration(plugins, metaAccess, declaringClass);
+        Registration r = new Registration(plugins, declaringClass);
         r.register1("reverseBytes", type, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 b.push(kind, b.append(new ReverseBytesNode(value).canonical(null, value)));
@@ -171,8 +171,8 @@
         });
     }
 
-    private static void registerCharacterPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Character.class);
+    private static void registerCharacterPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Character.class);
         r.register1("reverseBytes", char.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 // return (char) (Integer.reverse(i) >> 16);
@@ -185,8 +185,8 @@
         });
     }
 
-    private static void registerShortPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Short.class);
+    private static void registerShortPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Short.class);
         r.register1("reverseBytes", short.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 // return (short) (Integer.reverse(i) >> 16);
@@ -199,8 +199,8 @@
         });
     }
 
-    private static void registerFloatPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Float.class);
+    private static void registerFloatPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Float.class);
         r.register1("floatToRawIntBits", float.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 b.push(Kind.Int, b.append(new ReinterpretNode(Kind.Int, value).canonical(null, value)));
@@ -215,8 +215,8 @@
         });
     }
 
-    private static void registerDoublePlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Double.class);
+    private static void registerDoublePlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Double.class);
         r.register1("doubleToRawLongBits", double.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 b.push(Kind.Long, b.append(new ReinterpretNode(Kind.Long, value).canonical(null, value)));
@@ -231,8 +231,8 @@
         });
     }
 
-    private static void registerMathPlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Math.class);
+    private static void registerMathPlugins(Architecture arch, InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Math.class);
         r.register1("abs", Float.TYPE, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 b.push(Kind.Float, b.append(new AbsNode(value).canonical(null, value)));
@@ -297,8 +297,8 @@
         }
     }
 
-    private static void registerUnsignedMathPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, UnsignedMath.class);
+    private static void registerUnsignedMathPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, UnsignedMath.class);
         r.register2("aboveThan", int.class, int.class, new UnsignedMathPlugin(Condition.AT));
         r.register2("aboveThan", long.class, long.class, new UnsignedMathPlugin(Condition.AT));
         r.register2("belowThan", int.class, int.class, new UnsignedMathPlugin(Condition.BT));
@@ -333,17 +333,17 @@
         });
     }
 
-    protected static void registerBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
+    protected static void registerBoxingPlugins(InvocationPlugins plugins) {
         for (Kind kind : Kind.values()) {
             if (kind.isPrimitive() && kind != Kind.Void) {
-                new BoxPlugin(kind).register(metaAccess, plugins);
-                new UnboxPlugin(kind).register(metaAccess, plugins);
+                new BoxPlugin(kind).register(plugins);
+                new UnboxPlugin(kind).register(plugins);
             }
         }
     }
 
-    private static void registerObjectPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Object.class);
+    private static void registerObjectPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Object.class);
         r.register1("<init>", Receiver.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode object) {
                 if (RegisterFinalizerNode.mayHaveFinalizer(object, b.getAssumptions())) {
@@ -354,8 +354,8 @@
         });
     }
 
-    private static void registerClassPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Class.class);
+    private static void registerClassPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, Class.class);
         r.register2("isInstance", Receiver.class, Object.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode type, ValueNode object) {
                 ValueNode nullCheckedType = nullCheckedValue(b, type);
@@ -393,7 +393,7 @@
      * project containing {@link Edges}.
      */
     private static void registerEdgesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, Edges.class);
+        Registration r = new Registration(plugins, Edges.class);
         for (Class<?> c : new Class<?>[]{Node.class, NodeList.class}) {
             r.register2("get" + c.getSimpleName() + "Unsafe", Node.class, long.class, new InvocationPlugin() {
                 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode node, ValueNode offset) {
@@ -435,9 +435,8 @@
             return true;
         }
 
-        void register(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-            ResolvedJavaMethod method = Registration.resolve(metaAccess, kind.toBoxedJavaClass(), "valueOf", kind.toJavaClass());
-            plugins.register(method, this);
+        void register(InvocationPlugins plugins) {
+            plugins.register(this, kind.toBoxedJavaClass(), "valueOf", kind.toJavaClass());
         }
     }
 
@@ -463,10 +462,9 @@
             return true;
         }
 
-        void register(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
+        void register(InvocationPlugins plugins) {
             String name = kind.toJavaClass().getSimpleName() + "Value";
-            ResolvedJavaMethod method = Registration.resolve(metaAccess, kind.toBoxedJavaClass(), name);
-            plugins.register(method, this);
+            plugins.register(this, kind.toBoxedJavaClass(), name, Receiver.class);
         }
     }
 
@@ -524,8 +522,8 @@
         }
     }
 
-    private static void registerGraalDirectivesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, GraalDirectives.class);
+    private static void registerGraalDirectivesPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, GraalDirectives.class);
         r.register0("deoptimize", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
                 b.append(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.TransferToInterpreter));
@@ -584,7 +582,7 @@
         }
     }
 
-    private static void registerJMHBlackholePlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
+    private static void registerJMHBlackholePlugins(InvocationPlugins plugins) {
         InvocationPlugin blackholePlugin = new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode blackhole, ValueNode value) {
                 b.append(new BlackholeNode(value));
@@ -596,7 +594,7 @@
             Class<?> blackholeClass;
             blackholeClass = ReplacementsImpl.resolveClass(name, true);
             if (blackholeClass != null) {
-                Registration r = new Registration(plugins, metaAccess, blackholeClass);
+                Registration r = new Registration(plugins, blackholeClass);
                 for (Kind kind : Kind.values()) {
                     if ((kind.isPrimitive() && kind != Kind.Void) || kind == Kind.Object) {
                         Class<?> javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass();
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java	Thu Mar 12 22:10:07 2015 +0100
@@ -44,6 +44,7 @@
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.nodes.*;
 import com.oracle.graal.java.*;
+import com.oracle.graal.java.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.lir.asm.*;
 import com.oracle.graal.lir.phases.*;
 import com.oracle.graal.nodes.*;
@@ -192,7 +193,9 @@
         LIRSuites lirSuites = suitesProvider.createLIRSuites();
         removeInliningPhase(suites);
         StructuredGraph graph = new StructuredGraph(javaMethod, AllowAssumptions.NO);
-        new GraphBuilderPhase.Instance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), GraphBuilderConfiguration.getEagerDefault(), OptimisticOptimizations.ALL, null).apply(graph);
+        GraphBuilderConfiguration config = GraphBuilderConfiguration.getEagerDefault();
+        config.setPlugins(new Plugins(metaAccess));
+        new GraphBuilderPhase.Instance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), config, OptimisticOptimizations.ALL, null).apply(graph);
         PhaseSuite<HighTierContext> graphBuilderSuite = getGraphBuilderSuite(suitesProvider);
         CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false);
         Backend backend = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend();
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/ExactMathTest.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/ExactMathTest.java	Thu Mar 12 22:10:07 2015 +0100
@@ -33,7 +33,7 @@
 
     @Override
     protected void editGraphBuilderPlugins(GraphBuilderConfiguration.Plugins plugins) {
-        TruffleGraphBuilderPlugins.registerExactMathPlugins(getMetaAccess(), plugins.getInvocationPlugins());
+        TruffleGraphBuilderPlugins.registerExactMathPlugins(plugins.getInvocationPlugins());
         super.editGraphBuilderPlugins(plugins);
     }
 
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java	Thu Mar 12 22:10:07 2015 +0100
@@ -27,9 +27,9 @@
 
 import java.util.*;
 
-import com.oracle.graal.api.meta.Assumptions.Assumption;
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.code.CallingConvention.Type;
+import com.oracle.graal.api.meta.Assumptions.Assumption;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.replacements.*;
 import com.oracle.graal.api.runtime.*;
@@ -37,6 +37,7 @@
 import com.oracle.graal.debug.*;
 import com.oracle.graal.debug.Debug.Scope;
 import com.oracle.graal.java.*;
+import com.oracle.graal.java.GraphBuilderConfiguration.Plugins;
 import com.oracle.graal.lir.asm.*;
 import com.oracle.graal.lir.phases.*;
 import com.oracle.graal.nodes.*;
@@ -91,6 +92,7 @@
         GraphBuilderConfiguration eagerConfig = GraphBuilderConfiguration.getEagerDefault().withSkippedExceptionTypes(skippedExceptionTypes);
 
         this.config = GraphBuilderConfiguration.getDefault().withSkippedExceptionTypes(skippedExceptionTypes);
+        this.config.setPlugins(new Plugins(backendProviders.getMetaAccess()));
         if (TruffleCompilerOptions.FastPE.getValue()) {
             GraphBuilderPhase phase = (GraphBuilderPhase) backend.getSuites().getDefaultGraphBuilderSuite().findPhase(GraphBuilderPhase.class).previous();
             this.config.getPlugins().getInvocationPlugins().setDefaults(phase.getGraphBuilderConfig().getPlugins().getInvocationPlugins());
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Thu Mar 12 17:13:29 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Thu Mar 12 22:10:07 2015 +0100
@@ -34,7 +34,7 @@
 import com.oracle.graal.java.*;
 import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin;
 import com.oracle.graal.java.InvocationPlugins.Registration;
-import com.oracle.graal.java.InvocationPlugins.Registration.Receiver;
+import com.oracle.graal.java.InvocationPlugins.Receiver;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
@@ -53,22 +53,22 @@
 public class TruffleGraphBuilderPlugins {
     public static void registerInvocationPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
 
-        registerOptimizedAssumptionPlugins(metaAccess, plugins);
-        registerExactMathPlugins(metaAccess, plugins);
-        registerCompilerDirectivesPlugins(metaAccess, plugins);
+        registerOptimizedAssumptionPlugins(plugins);
+        registerExactMathPlugins(plugins);
+        registerCompilerDirectivesPlugins(plugins);
         registerOptimizedCallTargetPlugins(metaAccess, plugins);
-        registerUnsafeAccessImplPlugins(metaAccess, plugins);
+        registerUnsafeAccessImplPlugins(plugins);
 
         if (TruffleCompilerOptions.TruffleUseFrameWithoutBoxing.getValue()) {
-            registerFrameWithoutBoxingPlugins(metaAccess, plugins);
+            registerFrameWithoutBoxingPlugins(plugins);
         } else {
-            registerFrameWithBoxingPlugins(metaAccess, plugins);
+            registerFrameWithBoxingPlugins(plugins);
         }
 
     }
 
-    public static void registerOptimizedAssumptionPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, OptimizedAssumption.class);
+    public static void registerOptimizedAssumptionPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, OptimizedAssumption.class);
         r.register1("isValid", Receiver.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode arg) {
                 if (arg.isConstant()) {
@@ -86,8 +86,8 @@
         });
     }
 
-    public static void registerExactMathPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, ExactMath.class);
+    public static void registerExactMathPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, ExactMath.class);
         for (Kind kind : new Kind[]{Kind.Int, Kind.Long}) {
             Class<?> type = kind.toJavaClass();
             r.register2("addExact", type, type, new InvocationPlugin() {
@@ -123,8 +123,8 @@
         }
     }
 
-    public static void registerCompilerDirectivesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, CompilerDirectives.class);
+    public static void registerCompilerDirectivesPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, CompilerDirectives.class);
         r.register0("inInterpreter", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
                 b.push(Kind.Boolean.getStackKind(), b.append(ConstantNode.forBoolean(false)));
@@ -190,7 +190,7 @@
             }
         });
 
-        r = new Registration(plugins, metaAccess, CompilerAsserts.class);
+        r = new Registration(plugins, CompilerAsserts.class);
         r.register1("partialEvaluationConstant", Object.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) {
                 ValueNode curValue = value;
@@ -229,7 +229,7 @@
     }
 
     public static void registerOptimizedCallTargetPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, OptimizedCallTarget.class);
+        Registration r = new Registration(plugins, OptimizedCallTarget.class);
         r.register2("createFrame", FrameDescriptor.class, Object[].class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode descriptor, ValueNode args) {
                 Class<?> frameClass = TruffleCompilerOptions.TruffleUseFrameWithoutBoxing.getValue() ? FrameWithoutBoxing.class : FrameWithBoxing.class;
@@ -245,21 +245,21 @@
         });
     }
 
-    public static void registerFrameWithoutBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, FrameWithoutBoxing.class);
+    public static void registerFrameWithoutBoxingPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, FrameWithoutBoxing.class);
         registerMaterialize(r);
         registerUnsafeCast(r);
         registerUnsafeLoadStorePlugins(r, Kind.Int, Kind.Long, Kind.Float, Kind.Double, Kind.Object);
     }
 
-    public static void registerFrameWithBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, FrameWithBoxing.class);
+    public static void registerFrameWithBoxingPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, FrameWithBoxing.class);
         registerMaterialize(r);
         registerUnsafeCast(r);
     }
 
-    public static void registerUnsafeAccessImplPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
-        Registration r = new Registration(plugins, metaAccess, UnsafeAccessImpl.class);
+    public static void registerUnsafeAccessImplPlugins(InvocationPlugins plugins) {
+        Registration r = new Registration(plugins, UnsafeAccessImpl.class);
         registerUnsafeCast(r);
         registerUnsafeLoadStorePlugins(r, Kind.Boolean, Kind.Byte, Kind.Int, Kind.Short, Kind.Long, Kind.Float, Kind.Double, Kind.Object);
     }