# HG changeset patch # User Doug Simon # Date 1426021169 -3600 # Node ID 7117697d11e12a89fd51d177968d4737c9010ddf # Parent 2ddc2ddd89aca862fc61bfaf9d868d1b18d2d19c refactored graph builder plugins into a separate class renamed AnnotatedInvocationPlugins to GenericInvocationPlugin diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java Tue Mar 10 21:59:29 2015 +0100 @@ -73,7 +73,7 @@ try (InitTimer st = timer("graphBuilderPlugins.initialize")) { GraphBuilderPhase phase = (GraphBuilderPhase) providers.getSuites().getDefaultGraphBuilderSuite().findPhase(GraphBuilderPhase.class).previous(); - InvocationPlugins plugins = phase.getGraphBuilderConfig().getInvocationPlugins(); + InvocationPlugins plugins = phase.getGraphBuilderConfig().getPlugins().getInvocationPlugins(); registerInvocationPlugins(providers, plugins); } diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotAnnotatedInvocationPlugin.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotAnnotatedInvocationPlugin.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotAnnotatedInvocationPlugin.java Tue Mar 10 21:59:29 2015 +0100 @@ -35,7 +35,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.replacements.*; -final class HotSpotAnnotatedInvocationPlugin implements AnnotatedInvocationPlugin { +final class HotSpotAnnotatedInvocationPlugin implements GenericInvocationPlugin { private final HotSpotSuitesProvider suites; public HotSpotAnnotatedInvocationPlugin(HotSpotSuitesProvider suites) { diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java Tue Mar 10 21:59:29 2015 +0100 @@ -119,9 +119,9 @@ protected PhaseSuite createGraphBuilderSuite(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, Replacements replacements) { PhaseSuite suite = new PhaseSuite<>(); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(); - config.setLoadFieldPlugin(new HotSpotLoadFieldPlugin(metaAccess, constantReflection)); - config.setInlineInvokePlugin(new HotSpotInlineInvokePlugin(this, replacements)); - config.setAnnotatedInvocationPlugin(new HotSpotAnnotatedInvocationPlugin(this)); + config.getPlugins().setLoadFieldPlugin(new HotSpotLoadFieldPlugin(metaAccess, constantReflection)); + config.getPlugins().setInlineInvokePlugin(new HotSpotInlineInvokePlugin(this, replacements)); + config.getPlugins().setGenericInvocationPlugin(new HotSpotAnnotatedInvocationPlugin(this)); suite.appendPhase(new GraphBuilderPhase(config)); return suite; } diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Tue Mar 10 21:59:29 2015 +0100 @@ -689,7 +689,7 @@ Kind kind = field.getKind(); ValueNode receiver = frameState.apop(); if ((field instanceof ResolvedJavaField) && ((ResolvedJavaField) field).getDeclaringClass().isInitialized()) { - LoadFieldPlugin loadFieldPlugin = this.graphBuilderConfig.getLoadFieldPlugin(); + LoadFieldPlugin loadFieldPlugin = this.graphBuilderConfig.getPlugins().getLoadFieldPlugin(); if (loadFieldPlugin == null || !loadFieldPlugin.apply((GraphBuilderContext) this, receiver, (ResolvedJavaField) field)) { appendOptimizedLoadField(kind, genLoadField(receiver, (ResolvedJavaField) field)); } @@ -738,7 +738,7 @@ private void genGetStatic(JavaField field) { Kind kind = field.getKind(); if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) { - LoadFieldPlugin loadFieldPlugin = this.graphBuilderConfig.getLoadFieldPlugin(); + LoadFieldPlugin loadFieldPlugin = this.graphBuilderConfig.getPlugins().getLoadFieldPlugin(); if (loadFieldPlugin == null || !loadFieldPlugin.apply((GraphBuilderContext) this, (ResolvedJavaField) field)) { appendOptimizedLoadField(kind, genLoadField(null, (ResolvedJavaField) field)); } diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java Tue Mar 10 21:59:29 2015 +0100 @@ -26,7 +26,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; -import com.oracle.graal.java.GraphBuilderPlugin.AnnotatedInvocationPlugin; +import com.oracle.graal.java.GraphBuilderPlugin.GenericInvocationPlugin; import com.oracle.graal.java.GraphBuilderPlugin.InlineInvokePlugin; import com.oracle.graal.java.GraphBuilderPlugin.LoadFieldPlugin; import com.oracle.graal.java.GraphBuilderPlugin.LoopExplosionPlugin; @@ -34,6 +34,80 @@ import com.oracle.graal.nodes.*; public class GraphBuilderConfiguration { + + public static class Plugins { + private InvocationPlugins invocationPlugins; + private LoadFieldPlugin loadFieldPlugin; + private ParameterPlugin parameterPlugin; + private InlineInvokePlugin inlineInvokePlugin; + private GenericInvocationPlugin genericInvocationPlugin; + private LoopExplosionPlugin loopExplosionPlugin; + + public Plugins() { + invocationPlugins = new InvocationPlugins(); + } + + public Plugins(InvocationPlugins invocationPlugins) { + this.invocationPlugins = invocationPlugins; + } + + public InvocationPlugins getInvocationPlugins() { + return invocationPlugins; + } + + public GenericInvocationPlugin getGenericInvocationPlugin() { + return genericInvocationPlugin; + } + + public void setGenericInvocationPlugin(GenericInvocationPlugin plugin) { + this.genericInvocationPlugin = plugin; + } + + public LoadFieldPlugin getLoadFieldPlugin() { + return loadFieldPlugin; + } + + public void setLoadFieldPlugin(LoadFieldPlugin plugin) { + this.loadFieldPlugin = plugin; + } + + public ParameterPlugin getParameterPlugin() { + return parameterPlugin; + } + + public void setParameterPlugin(ParameterPlugin plugin) { + this.parameterPlugin = plugin; + } + + public InlineInvokePlugin getInlineInvokePlugin() { + return inlineInvokePlugin; + } + + public void setInlineInvokePlugin(InlineInvokePlugin plugin) { + this.inlineInvokePlugin = plugin; + } + + public LoopExplosionPlugin getLoopExplosionPlugin() { + return loopExplosionPlugin; + } + + public void setLoopExplosionPlugin(LoopExplosionPlugin plugin) { + this.loopExplosionPlugin = plugin; + } + + public Plugins updateFrom(Plugins other, boolean includeInvocationPlugins) { + if (includeInvocationPlugins) { + this.invocationPlugins.updateFrom(other.getInvocationPlugins()); + } + this.parameterPlugin = other.parameterPlugin; + this.loadFieldPlugin = other.loadFieldPlugin; + this.inlineInvokePlugin = other.inlineInvokePlugin; + this.loopExplosionPlugin = other.loopExplosionPlugin; + this.genericInvocationPlugin = other.genericInvocationPlugin; + return this; + } + } + private static final ResolvedJavaType[] EMPTY = new ResolvedJavaType[]{}; private final boolean eagerResolving; @@ -41,13 +115,8 @@ private final ResolvedJavaType[] skippedExceptionTypes; private final DebugInfoMode debugInfoMode; private final boolean doLivenessAnalysis; - private InvocationPlugins invocationPlugins = new InvocationPlugins(); - private LoadFieldPlugin loadFieldPlugin; - private ParameterPlugin parameterPlugin; - private InlineInvokePlugin inlineInvokePlugin; - private AnnotatedInvocationPlugin annotatedInvocationPlugin; - private LoopExplosionPlugin loopExplosionPlugin; private boolean useProfiling; + private Plugins plugins = new Plugins(); public static enum DebugInfoMode { SafePointsOnly, @@ -114,26 +183,6 @@ return new GraphBuilderConfiguration(eagerResolving, omitAllExceptionEdges, debugInfoMode, skippedExceptionTypes, newLivenessAnalysis); } - public InvocationPlugins getInvocationPlugins() { - return invocationPlugins; - } - - public AnnotatedInvocationPlugin getAnnotatedInvocationPlugin() { - return annotatedInvocationPlugin; - } - - public void setAnnotatedInvocationPlugin(AnnotatedInvocationPlugin plugin) { - this.annotatedInvocationPlugin = plugin; - } - - public LoadFieldPlugin getLoadFieldPlugin() { - return loadFieldPlugin; - } - - public void setLoadFieldPlugin(LoadFieldPlugin plugin) { - this.loadFieldPlugin = plugin; - } - public ResolvedJavaType[] getSkippedExceptionTypes() { return skippedExceptionTypes; } @@ -183,37 +232,16 @@ return eagerResolving; } - public ParameterPlugin getParameterPlugin() { - return parameterPlugin; - } - - public void setParameterPlugin(ParameterPlugin plugin) { - this.parameterPlugin = plugin; + public Plugins getPlugins() { + return plugins; } - public InlineInvokePlugin getInlineInvokePlugin() { - return inlineInvokePlugin; - } - - public void setInlineInvokePlugin(InlineInvokePlugin plugin) { - this.inlineInvokePlugin = plugin; - } - - public LoopExplosionPlugin getLoopExplosionPlugin() { - return loopExplosionPlugin; - } - - public void setLoopExplosionPlugin(LoopExplosionPlugin plugin) { - this.loopExplosionPlugin = plugin; + public void setPlugins(Plugins plugins) { + this.plugins = plugins; } public GraphBuilderConfiguration copyPluginsFrom(GraphBuilderConfiguration other) { - this.invocationPlugins.updateFrom(other.getInvocationPlugins()); - this.parameterPlugin = other.parameterPlugin; - this.loadFieldPlugin = other.loadFieldPlugin; - this.inlineInvokePlugin = other.inlineInvokePlugin; - this.loopExplosionPlugin = other.loopExplosionPlugin; - this.annotatedInvocationPlugin = other.annotatedInvocationPlugin; + this.plugins.updateFrom(other.plugins, true); return this; } } diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Mar 10 21:59:29 2015 +0100 @@ -47,7 +47,7 @@ import com.oracle.graal.graph.iterators.*; import com.oracle.graal.java.BciBlockMapping.BciBlock; import com.oracle.graal.java.BciBlockMapping.ExceptionDispatchBlock; -import com.oracle.graal.java.GraphBuilderPlugin.AnnotatedInvocationPlugin; +import com.oracle.graal.java.GraphBuilderPlugin.GenericInvocationPlugin; import com.oracle.graal.java.GraphBuilderPlugin.InlineInvokePlugin; import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin; import com.oracle.graal.java.GraphBuilderPlugin.LoopExplosionPlugin; @@ -129,7 +129,7 @@ assert method.getCode() != null : "method must contain bytecodes: " + method; this.currentGraph = graph; HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(method, graph, true, null); - frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving(), this.graphBuilderConfig.getParameterPlugin()); + frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving(), this.graphBuilderConfig.getPlugins().getParameterPlugin()); TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method); try { BytecodeParser parser = new BytecodeParser(null, metaAccess, method, graphBuilderConfig, optimisticOpts, entryBCI, rootMethodIsReplacement); @@ -231,7 +231,7 @@ previousLineNumber = -1; } - LoopExplosionPlugin loopExplosionPlugin = graphBuilderConfig.getLoopExplosionPlugin(); + LoopExplosionPlugin loopExplosionPlugin = graphBuilderConfig.getPlugins().getLoopExplosionPlugin(); if (loopExplosionPlugin != null) { explodeLoops = loopExplosionPlugin.shouldExplodeLoops(method); if (explodeLoops) { @@ -1093,7 +1093,7 @@ } private boolean tryInvocationPlugin(ValueNode[] args, ResolvedJavaMethod targetMethod, Kind resultType) { - InvocationPlugin plugin = graphBuilderConfig.getInvocationPlugins().lookupInvocation(targetMethod); + InvocationPlugin plugin = graphBuilderConfig.getPlugins().getInvocationPlugins().lookupInvocation(targetMethod); if (plugin != null) { int beforeStackSize = frameState.stackSize; boolean needsNullCheck = !targetMethod.isStatic() && args[0].getKind() == Kind.Object && !StampTool.isPointerNonNull(args[0].stamp()); @@ -1112,7 +1112,7 @@ } private boolean tryAnnotatedInvocationPlugin(ValueNode[] args, ResolvedJavaMethod targetMethod) { - AnnotatedInvocationPlugin plugin = graphBuilderConfig.getAnnotatedInvocationPlugin(); + GenericInvocationPlugin plugin = graphBuilderConfig.getPlugins().getGenericInvocationPlugin(); return plugin != null && plugin.apply(this, targetMethod, args); } @@ -1129,7 +1129,7 @@ } private boolean tryInline(ValueNode[] args, ResolvedJavaMethod targetMethod, InvokeKind invokeKind, JavaType returnType) { - InlineInvokePlugin plugin = graphBuilderConfig.getInlineInvokePlugin(); + InlineInvokePlugin plugin = graphBuilderConfig.getPlugins().getInlineInvokePlugin(); if (plugin == null || !invokeKind.isDirect() || !targetMethod.canBeInlined()) { return false; } diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Tue Mar 10 21:59:29 2015 +0100 @@ -89,9 +89,10 @@ } /** - * Plugin for handling an invocation based on the annotations of the invoked method. + * Plugin for handling an invocation based on some property of the method being invoked such as + * any annotations it may have. */ - public interface AnnotatedInvocationPlugin extends GraphBuilderPlugin { + public interface GenericInvocationPlugin extends GraphBuilderPlugin { /** * Executes this plugin for an invocation of a given method with a given set of arguments. * diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Tue Mar 10 21:59:29 2015 +0100 @@ -38,6 +38,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.Node; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.java.GraphBuilderPlugin.LoadFieldPlugin; import com.oracle.graal.java.GraphBuilderPlugin.ParameterPlugin; import com.oracle.graal.loop.*; @@ -252,12 +253,13 @@ private void fastPartialEvaluation(OptimizedCallTarget callTarget, StructuredGraph graph, PhaseContext baseContext, HighTierContext tierContext) { GraphBuilderConfiguration newConfig = configForRoot.copy(); newConfig.setUseProfiling(false); - newConfig.setLoadFieldPlugin(new InterceptLoadFieldPlugin()); - newConfig.setParameterPlugin(new InterceptReceiverPlugin(callTarget)); + Plugins plugins = newConfig.getPlugins(); + plugins.setLoadFieldPlugin(new InterceptLoadFieldPlugin()); + plugins.setParameterPlugin(new InterceptReceiverPlugin(callTarget)); callTarget.setInlining(new TruffleInlining(callTarget, new DefaultInliningPolicy())); - newConfig.setInlineInvokePlugin(new InlineInvokePlugin(callTarget.getInlining(), providers.getReplacements())); - newConfig.setLoopExplosionPlugin(new LoopExplosionPlugin()); - TruffleGraphBuilderPlugins.registerInvocationPlugins(providers.getMetaAccess(), newConfig.getInvocationPlugins()); + plugins.setInlineInvokePlugin(new InlineInvokePlugin(callTarget.getInlining(), providers.getReplacements())); + plugins.setLoopExplosionPlugin(new LoopExplosionPlugin()); + TruffleGraphBuilderPlugins.registerInvocationPlugins(providers.getMetaAccess(), newConfig.getPlugins().getInvocationPlugins()); new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), this.snippetReflection, providers.getConstantReflection(), newConfig, TruffleCompilerImpl.Optimizations, false).apply(graph); Debug.dump(graph, "After FastPE"); diff -r 2ddc2ddd89ac -r 7117697d11e1 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Tue Mar 10 21:39:31 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Tue Mar 10 21:59:29 2015 +0100 @@ -93,7 +93,7 @@ this.config = GraphBuilderConfiguration.getDefault().withSkippedExceptionTypes(skippedExceptionTypes); if (TruffleCompilerOptions.FastPE.getValue()) { GraphBuilderPhase phase = (GraphBuilderPhase) backend.getSuites().getDefaultGraphBuilderSuite().findPhase(GraphBuilderPhase.class).previous(); - this.config.getInvocationPlugins().setDefaults(phase.getGraphBuilderConfig().getInvocationPlugins()); + this.config.getPlugins().getInvocationPlugins().setDefaults(phase.getGraphBuilderConfig().getPlugins().getInvocationPlugins()); } this.truffleCache = new TruffleCacheImpl(providers, eagerConfig, TruffleCompilerImpl.Optimizations);