< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsImpl.java

Print this page
rev 52509 : [mq]: graal2


  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.replacements;
  26 
  27 import static org.graalvm.compiler.core.common.GraalOptions.UseSnippetGraphCache;
  28 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
  29 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
  30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineIntrinsicsDuringParsing;
  31 import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
  32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;

  33 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
  34 
  35 import java.util.Collections;
  36 import java.util.List;
  37 import java.util.concurrent.ConcurrentHashMap;
  38 import java.util.concurrent.ConcurrentMap;
  39 import java.util.concurrent.atomic.AtomicInteger;
  40 
  41 import jdk.internal.vm.compiler.collections.EconomicMap;
  42 import jdk.internal.vm.compiler.collections.Equivalence;
  43 import org.graalvm.compiler.api.replacements.Fold;
  44 import org.graalvm.compiler.api.replacements.MethodSubstitution;
  45 import org.graalvm.compiler.api.replacements.Snippet;
  46 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
  47 import org.graalvm.compiler.api.replacements.SnippetTemplateCache;
  48 import org.graalvm.compiler.bytecode.Bytecode;
  49 import org.graalvm.compiler.bytecode.BytecodeProvider;
  50 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;

  51 import org.graalvm.compiler.core.common.GraalOptions;
  52 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
  53 import org.graalvm.compiler.debug.DebugCloseable;
  54 import org.graalvm.compiler.debug.DebugContext;
  55 import org.graalvm.compiler.debug.DebugContext.Description;
  56 import org.graalvm.compiler.debug.DebugHandlersFactory;
  57 import org.graalvm.compiler.debug.GraalError;
  58 import org.graalvm.compiler.debug.TimerKey;
  59 import org.graalvm.compiler.graph.Node;
  60 import org.graalvm.compiler.graph.NodeSourcePosition;
  61 import org.graalvm.compiler.graph.Node.NodeIntrinsic;

  62 import org.graalvm.compiler.java.GraphBuilderPhase;
  63 import org.graalvm.compiler.java.GraphBuilderPhase.Instance;
  64 import org.graalvm.compiler.nodes.CallTargetNode;
  65 import org.graalvm.compiler.nodes.Invoke;
  66 import org.graalvm.compiler.nodes.StateSplit;
  67 import org.graalvm.compiler.nodes.StructuredGraph;
  68 import org.graalvm.compiler.nodes.ValueNode;
  69 import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
  70 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
  71 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
  72 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
  73 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
  74 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
  75 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
  76 import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
  77 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
  78 import org.graalvm.compiler.nodes.spi.Replacements;
  79 import org.graalvm.compiler.nodes.spi.StampProvider;
  80 import org.graalvm.compiler.options.OptionValues;
  81 import org.graalvm.compiler.phases.OptimisticOptimizations;


 292                         graph.freeze();
 293                         graphs.putIfAbsent(substitute, graph);
 294                         graph = graphs.get(substitute);
 295                     }
 296                 }
 297                 assert graph.isFrozen();
 298                 result = graph;
 299             } else {
 300                 Bytecode code = new ResolvedJavaMethodBytecode(method);
 301                 ConstantReflectionProvider constantReflection = providers.getConstantReflection();
 302                 ConstantFieldProvider constantFieldProvider = providers.getConstantFieldProvider();
 303                 StampProvider stampProvider = providers.getStampProvider();
 304                 try (DebugContext debug = openDebugContext("Substitution_", method)) {
 305                     result = new IntrinsicGraphBuilder(options, debug, metaAccess, constantReflection, constantFieldProvider, stampProvider, code, invokeBci).buildGraph(plugin);
 306                 }
 307             }
 308         } else {
 309             result = null;
 310         }
 311         return result;































 312     }
 313 
 314     /**
 315      * Creates a preprocessed graph for a snippet or method substitution.
 316      *
 317      * @param bytecodeProvider how to access the bytecode of {@code method}
 318      * @param method the snippet or method substitution for which a graph will be created
 319      * @param args
 320      * @param original the original method if {@code method} is a {@linkplain MethodSubstitution
 321      *            substitution} otherwise null
 322      * @param trackNodeSourcePosition
 323      */
 324     public StructuredGraph makeGraph(DebugContext debug, BytecodeProvider bytecodeProvider, ResolvedJavaMethod method, Object[] args, ResolvedJavaMethod original, boolean trackNodeSourcePosition,
 325                     NodeSourcePosition replaceePosition) {
 326         return createGraphMaker(method, original).makeGraph(debug, bytecodeProvider, args, trackNodeSourcePosition, replaceePosition);
 327     }
 328 
 329     /**
 330      * Can be overridden to return an object that specializes various parts of graph preprocessing.
 331      */




  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.replacements;
  26 
  27 import static org.graalvm.compiler.core.common.GraalOptions.UseSnippetGraphCache;
  28 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
  29 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
  30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineIntrinsicsDuringParsing;
  31 import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
  32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
  33 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.ROOT_COMPILATION;
  34 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
  35 
  36 import java.util.Collections;
  37 import java.util.List;
  38 import java.util.concurrent.ConcurrentHashMap;
  39 import java.util.concurrent.ConcurrentMap;
  40 import java.util.concurrent.atomic.AtomicInteger;
  41 
  42 import jdk.internal.vm.compiler.collections.EconomicMap;
  43 import jdk.internal.vm.compiler.collections.Equivalence;
  44 import org.graalvm.compiler.api.replacements.Fold;
  45 import org.graalvm.compiler.api.replacements.MethodSubstitution;
  46 import org.graalvm.compiler.api.replacements.Snippet;
  47 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
  48 import org.graalvm.compiler.api.replacements.SnippetTemplateCache;
  49 import org.graalvm.compiler.bytecode.Bytecode;
  50 import org.graalvm.compiler.bytecode.BytecodeProvider;
  51 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
  52 import org.graalvm.compiler.core.common.CompilationIdentifier;
  53 import org.graalvm.compiler.core.common.GraalOptions;
  54 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
  55 import org.graalvm.compiler.debug.DebugCloseable;
  56 import org.graalvm.compiler.debug.DebugContext;
  57 import org.graalvm.compiler.debug.DebugContext.Description;
  58 import org.graalvm.compiler.debug.DebugHandlersFactory;
  59 import org.graalvm.compiler.debug.GraalError;
  60 import org.graalvm.compiler.debug.TimerKey;
  61 import org.graalvm.compiler.graph.Node;

  62 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
  63 import org.graalvm.compiler.graph.NodeSourcePosition;
  64 import org.graalvm.compiler.java.GraphBuilderPhase;
  65 import org.graalvm.compiler.java.GraphBuilderPhase.Instance;
  66 import org.graalvm.compiler.nodes.CallTargetNode;
  67 import org.graalvm.compiler.nodes.Invoke;
  68 import org.graalvm.compiler.nodes.StateSplit;
  69 import org.graalvm.compiler.nodes.StructuredGraph;
  70 import org.graalvm.compiler.nodes.ValueNode;
  71 import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
  72 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
  73 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
  74 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
  75 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
  76 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
  77 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
  78 import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
  79 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
  80 import org.graalvm.compiler.nodes.spi.Replacements;
  81 import org.graalvm.compiler.nodes.spi.StampProvider;
  82 import org.graalvm.compiler.options.OptionValues;
  83 import org.graalvm.compiler.phases.OptimisticOptimizations;


 294                         graph.freeze();
 295                         graphs.putIfAbsent(substitute, graph);
 296                         graph = graphs.get(substitute);
 297                     }
 298                 }
 299                 assert graph.isFrozen();
 300                 result = graph;
 301             } else {
 302                 Bytecode code = new ResolvedJavaMethodBytecode(method);
 303                 ConstantReflectionProvider constantReflection = providers.getConstantReflection();
 304                 ConstantFieldProvider constantFieldProvider = providers.getConstantFieldProvider();
 305                 StampProvider stampProvider = providers.getStampProvider();
 306                 try (DebugContext debug = openDebugContext("Substitution_", method)) {
 307                     result = new IntrinsicGraphBuilder(options, debug, metaAccess, constantReflection, constantFieldProvider, stampProvider, code, invokeBci).buildGraph(plugin);
 308                 }
 309             }
 310         } else {
 311             result = null;
 312         }
 313         return result;
 314     }
 315 
 316     @SuppressWarnings("try")
 317     @Override
 318     public StructuredGraph getIntrinsicGraph(ResolvedJavaMethod method, CompilationIdentifier compilationId, DebugContext debug) {
 319         Bytecode subst = getSubstitutionBytecode(method);
 320         if (subst != null) {
 321             ResolvedJavaMethod substMethod = subst.getMethod();
 322             assert !substMethod.equals(method);
 323             BytecodeProvider bytecodeProvider = subst.getOrigin();
 324             // @formatter:off
 325             StructuredGraph graph = new StructuredGraph.Builder(options, debug, StructuredGraph.AllowAssumptions.YES).
 326                     method(substMethod).
 327                     compilationId(compilationId).
 328                     recordInlinedMethods(bytecodeProvider.shouldRecordMethodDependencies()).
 329                     setIsSubstitution(true).
 330                     build();
 331             // @formatter:on
 332             try (DebugContext.Scope scope = debug.scope("GetIntrinsicGraph", graph)) {
 333                 Plugins plugins = new Plugins(getGraphBuilderPlugins());
 334                 GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(plugins);
 335                 IntrinsicContext initialReplacementContext = new IntrinsicContext(method, substMethod, bytecodeProvider, ROOT_COMPILATION);
 336                 new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), config,
 337                                 OptimisticOptimizations.NONE, initialReplacementContext).apply(graph);
 338                 assert !graph.isFrozen();
 339                 return graph;
 340             } catch (Throwable e) {
 341                 debug.handle(e);
 342             }
 343         }
 344         return null;
 345     }
 346 
 347     /**
 348      * Creates a preprocessed graph for a snippet or method substitution.
 349      *
 350      * @param bytecodeProvider how to access the bytecode of {@code method}
 351      * @param method the snippet or method substitution for which a graph will be created
 352      * @param args
 353      * @param original the original method if {@code method} is a {@linkplain MethodSubstitution
 354      *            substitution} otherwise null
 355      * @param trackNodeSourcePosition
 356      */
 357     public StructuredGraph makeGraph(DebugContext debug, BytecodeProvider bytecodeProvider, ResolvedJavaMethod method, Object[] args, ResolvedJavaMethod original, boolean trackNodeSourcePosition,
 358                     NodeSourcePosition replaceePosition) {
 359         return createGraphMaker(method, original).makeGraph(debug, bytecodeProvider, args, trackNodeSourcePosition, replaceePosition);
 360     }
 361 
 362     /**
 363      * Can be overridden to return an object that specializes various parts of graph preprocessing.
 364      */


< prev index next >