# HG changeset patch # User Doug Simon # Date 1424092552 -3600 # Node ID 1307b475f10d5cb95f463cd0d0580927740f0d98 # Parent 7345e1a7069fba53ca8d8502a724c85b2640a128 added BytecodeParser.parsingReplacement field to distinguish parsing method replacements (or snippets) from normal method parsing diff -r 7345e1a7069f -r 1307b475f10d 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 Mon Feb 16 14:01:41 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Mon Feb 16 14:15:52 2015 +0100 @@ -76,11 +76,17 @@ protected final MetaAccessProvider metaAccess; /** + * Specifies if the {@linkplain #getMethod() method} being parsed implements the semantics of + * another method (i.e., an intrinsic) or bytecode instruction (i.e., a snippet). substitution. + */ + protected final boolean parsingReplacement; + + /** * Meters the number of actual bytecodes parsed. */ public static final DebugMetric BytecodesParsed = Debug.metric("BytecodesParsed"); - public AbstractBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { + public AbstractBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, boolean isReplacement) { this.graphBuilderConfig = graphBuilderConfig; this.optimisticOpts = optimisticOpts; this.metaAccess = metaAccess; @@ -88,6 +94,7 @@ this.profilingInfo = method.getProfilingInfo(); this.constantPool = method.getConstantPool(); this.method = method; + this.parsingReplacement = isReplacement; assert metaAccess != null; } diff -r 7345e1a7069f -r 1307b475f10d graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java Mon Feb 16 14:01:41 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java Mon Feb 16 14:15:52 2015 +0100 @@ -57,6 +57,11 @@ void push(Kind kind, ValueNode value); /** + * Determines if the graph builder is parsing a snippet or method substitution. + */ + boolean parsingReplacement(); + + /** * @see GuardingPiNode#nullCheckedValue(ValueNode) */ static ValueNode nullCheckedValue(GraphBuilderContext builder, ValueNode value) { diff -r 7345e1a7069f -r 1307b475f10d 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 Mon Feb 16 14:01:41 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 16 14:15:52 2015 +0100 @@ -26,6 +26,7 @@ import static com.oracle.graal.api.meta.DeoptimizationReason.*; import static com.oracle.graal.bytecode.Bytecodes.*; import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.nodes.StructuredGraph.*; import java.util.*; @@ -130,7 +131,7 @@ frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving(), this.graphBuilderConfig.getParameterPlugin()); TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method); try { - BytecodeParser parser = new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, entryBCI); + BytecodeParser parser = new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, entryBCI, false); parser.build(0, graph.start(), frameState); parser.connectLoopEndToBegin(); @@ -198,8 +199,14 @@ private int returnCount; private boolean controlFlowSplit; - public BytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, int entryBCI) { - super(metaAccess, method, graphBuilderConfig, optimisticOpts); + /** + * @param isReplacement specifies if this object is being used to parse a method that + * implements the semantics of another method (i.e., an intrinsic) or + * bytecode instruction (i.e., a snippet) + */ + public BytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, int entryBCI, + boolean isReplacement) { + super(metaAccess, method, graphBuilderConfig, optimisticOpts, isReplacement); this.entryBCI = entryBCI; if (graphBuilderConfig.insertNonSafepointDebugInfo()) { @@ -882,7 +889,7 @@ } ResolvedJavaMethod inlinedTargetMethod = inlinedMethod; - parseAndInlineCallee(inlinedTargetMethod, args); + parseAndInlineCallee(inlinedTargetMethod, args, parsingReplacement || inlinedMethod != targetMethod); inlineInvokePlugin.postInline(inlinedTargetMethod); return; } @@ -932,8 +939,8 @@ return false; } - private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args) { - BytecodeParser parser = new BytecodeParser(metaAccess, targetMethod, graphBuilderConfig, optimisticOpts, StructuredGraph.INVOCATION_ENTRY_BCI); + private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args, boolean isReplacement) { + BytecodeParser parser = new BytecodeParser(metaAccess, targetMethod, graphBuilderConfig, optimisticOpts, INVOCATION_ENTRY_BCI, isReplacement); final FrameState[] lazyFrameState = new FrameState[1]; HIRFrameStateBuilder startFrameState = new HIRFrameStateBuilder(targetMethod, currentGraph, () -> { if (lazyFrameState[0] == null) { @@ -1821,6 +1828,9 @@ return snippetReflectionProvider; } + public boolean parsingReplacement() { + return parsingReplacement; + } } } }