src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java	Mon Mar 20 17:39:08 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java	Mon Mar 20 17:39:08 2017

*** 20,54 **** --- 20,58 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.hotspot.stubs; import static org.graalvm.compiler.nodes.StructuredGraph.NO_PROFILING_INFO; import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING; import java.lang.reflect.Method; import org.graalvm.compiler.api.replacements.Snippet; import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter; ! import org.graalvm.compiler.core.common.CompilationIdentifier; ! import org.graalvm.compiler.api.replacements.Snippet.NonNullParameter; import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; + import org.graalvm.compiler.bytecode.BytecodeProvider; + import org.graalvm.compiler.core.common.CompilationIdentifier; + import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.debug.Debug; import org.graalvm.compiler.debug.Debug.Scope; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage; import org.graalvm.compiler.hotspot.meta.HotSpotProviders; import org.graalvm.compiler.java.GraphBuilderPhase; + import org.graalvm.compiler.nodes.ParameterNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext; import org.graalvm.compiler.nodes.spi.LoweringTool; + import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.LoweringPhase; + import org.graalvm.compiler.phases.common.RemoveValueProxyPhase; import org.graalvm.compiler.phases.tiers.PhaseContext; import org.graalvm.compiler.replacements.ConstantBindingParameterPlugin; import org.graalvm.compiler.replacements.SnippetTemplate; import org.graalvm.compiler.replacements.Snippets;
*** 69,80 **** --- 73,84 ---- * * @param snippetMethodName name of the single {@link Snippet} annotated method in the class of * this object * @param linkage linkage details for a call to the stub */ ! public SnippetStub(String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) { ! this(null, snippetMethodName, options, providers, linkage); } /** * Creates a new snippet stub. *
*** 82,106 **** --- 86,101 ---- * declared. If {@code null}, this the class of this object is used. * @param snippetMethodName name of the single {@link Snippet} annotated method in * {@code snippetDeclaringClass} * @param linkage linkage details for a call to the stub */ ! public SnippetStub(Class<? extends Snippets> snippetDeclaringClass, String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) { ! super(options, providers, linkage); Method javaMethod = SnippetTemplate.AbstractTemplates.findMethod(snippetDeclaringClass == null ? getClass() : snippetDeclaringClass, snippetMethodName, null); this.method = providers.getMetaAccess().lookupJavaMethod(javaMethod); } @SuppressWarnings("all") private static boolean assertionsEnabled() { boolean enabled = false; assert enabled = true; return enabled; } public static final ThreadLocal<StructuredGraph> SnippetGraphUnderConstruction = assertionsEnabled() ? new ThreadLocal<>() : null; @Override @SuppressWarnings("try") protected StructuredGraph getGraph(CompilationIdentifier compilationId) { Plugins defaultPlugins = providers.getGraphBuilderPlugins(); MetaAccessProvider metaAccess = providers.getMetaAccess();
*** 110,142 **** --- 105,133 ---- plugins.prependParameterPlugin(new ConstantBindingParameterPlugin(makeConstArgs(), metaAccess, snippetReflection)); GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(plugins); // Stubs cannot have optimistic assumptions since they have // to be valid for the entire run of the VM. ! final StructuredGraph graph = new StructuredGraph(method, AllowAssumptions.NO, NO_PROFILING_INFO, compilationId); ! final StructuredGraph graph = new StructuredGraph.Builder(options).method(method).compilationId(compilationId).build(); try (Scope outer = Debug.scope("SnippetStub", graph)) { graph.disableUnsafeAccessTracking(); if (SnippetGraphUnderConstruction != null) { assert SnippetGraphUnderConstruction.get() == null : SnippetGraphUnderConstruction.get().toString() + " " + graph; SnippetGraphUnderConstruction.set(graph); } try { IntrinsicContext initialIntrinsicContext = new IntrinsicContext(method, method, providers.getReplacements().getReplacementBytecodeProvider(), INLINE_AFTER_PARSING); + IntrinsicContext initialIntrinsicContext = new IntrinsicContext(method, method, getReplacementsBytecodeProvider(), INLINE_AFTER_PARSING); GraphBuilderPhase.Instance instance = new GraphBuilderPhase.Instance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), config, OptimisticOptimizations.NONE, initialIntrinsicContext); instance.apply(graph); ! } finally { ! if (SnippetGraphUnderConstruction != null) { SnippetGraphUnderConstruction.set(null); ! for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) { ! int index = param.index(); + if (method.getParameterAnnotation(NonNullParameter.class, index) != null) { + param.setStamp(param.stamp().join(StampFactory.objectNonNull())); } } + new RemoveValueProxyPhase().apply(graph); graph.setGuardsStage(GuardsStage.FLOATING_GUARDS); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); PhaseContext context = new PhaseContext(providers); canonicalizer.apply(graph, context); new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context);
*** 145,154 **** --- 136,149 ---- } return graph; } + protected BytecodeProvider getReplacementsBytecodeProvider() { + return providers.getReplacements().getReplacementBytecodeProvider(); + } + protected boolean checkConstArg(int index, String expectedName) { assert method.getParameterAnnotation(ConstantParameter.class, index) != null : String.format("parameter %d of %s is expected to be constant", index, method.format("%H.%n(%p)")); LocalVariableTable lvt = method.getLocalVariableTable(); if (lvt != null) { Local local = lvt.getLocal(index, 0);

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File