26
27 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Optional;
28
29 import java.util.ArrayList;
30 import java.util.List;
31
32 import org.graalvm.compiler.core.common.type.Stamp;
33 import org.graalvm.compiler.debug.DebugContext;
34 import org.graalvm.compiler.graph.Node;
35 import org.graalvm.compiler.graph.NodeInputList;
36 import org.graalvm.compiler.nodes.ConstantNode;
37 import org.graalvm.compiler.nodes.Invoke;
38 import org.graalvm.compiler.nodes.NodeView;
39 import org.graalvm.compiler.nodes.ParameterNode;
40 import org.graalvm.compiler.nodes.StructuredGraph;
41 import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
44 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
45 import org.graalvm.compiler.phases.common.inlining.InliningUtil;
46 import org.graalvm.compiler.phases.graph.FixedNodeProbabilityCache;
47 import org.graalvm.compiler.phases.tiers.HighTierContext;
48
49 import jdk.vm.ci.meta.ResolvedJavaMethod;
50
51 /**
52 * <p>
53 * Represents a feasible concrete target for inlining, whose graph has been copied already and thus
54 * can be modified without affecting the original (usually cached) version.
55 * </p>
56 *
57 * <p>
58 * Instances of this class don't make sense in isolation but as part of an
59 * {@link org.graalvm.compiler.phases.common.inlining.info.InlineInfo InlineInfo}.
60 * </p>
61 *
62 * @see org.graalvm.compiler.phases.common.inlining.walker.InliningData#moveForward()
63 * @see org.graalvm.compiler.phases.common.inlining.walker.CallsiteHolderExplorable
64 */
65 public class InlineableGraph implements Inlineable {
66
67 private final StructuredGraph graph;
68
69 private FixedNodeProbabilityCache probabilites = new FixedNodeProbabilityCache();
70
71 public InlineableGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context, CanonicalizerPhase canonicalizer, boolean trackNodeSourcePosition) {
72 StructuredGraph original = InliningUtil.getIntrinsicGraph(context.getReplacements(), method, invoke.bci(), trackNodeSourcePosition, null);
73 if (original == null) {
74 original = parseBytecodes(method, context, canonicalizer, invoke.asNode().graph(), trackNodeSourcePosition);
75 } else if (original.isFrozen()) {
76 // Graph may be modified by specializeGraphToArguments so defensively
77 // make a copy. We rely on the frozen state of a graph to denote
78 // whether it is shared.
79 original = (StructuredGraph) original.copy(invoke.asNode().getDebug());
80 }
81 this.graph = original;
82 specializeGraphToArguments(invoke, context, canonicalizer);
83 }
84
85 /**
86 * @return true iff one or more parameters <code>newGraph</code> were specialized to account for
87 * a constant argument, or an argument with a more specific stamp.
88 */
89 @SuppressWarnings("try")
|
26
27 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Optional;
28
29 import java.util.ArrayList;
30 import java.util.List;
31
32 import org.graalvm.compiler.core.common.type.Stamp;
33 import org.graalvm.compiler.debug.DebugContext;
34 import org.graalvm.compiler.graph.Node;
35 import org.graalvm.compiler.graph.NodeInputList;
36 import org.graalvm.compiler.nodes.ConstantNode;
37 import org.graalvm.compiler.nodes.Invoke;
38 import org.graalvm.compiler.nodes.NodeView;
39 import org.graalvm.compiler.nodes.ParameterNode;
40 import org.graalvm.compiler.nodes.StructuredGraph;
41 import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
42 import org.graalvm.compiler.nodes.ValueNode;
43 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
44 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
45 import org.graalvm.compiler.phases.common.inlining.InliningUtil;
46 import org.graalvm.compiler.phases.graph.FixedNodeRelativeFrequencyCache;
47 import org.graalvm.compiler.phases.tiers.HighTierContext;
48
49 import jdk.vm.ci.meta.ResolvedJavaMethod;
50
51 /**
52 * <p>
53 * Represents a feasible concrete target for inlining, whose graph has been copied already and thus
54 * can be modified without affecting the original (usually cached) version.
55 * </p>
56 *
57 * <p>
58 * Instances of this class don't make sense in isolation but as part of an
59 * {@link org.graalvm.compiler.phases.common.inlining.info.InlineInfo InlineInfo}.
60 * </p>
61 *
62 * @see org.graalvm.compiler.phases.common.inlining.walker.InliningData#moveForward()
63 * @see org.graalvm.compiler.phases.common.inlining.walker.CallsiteHolderExplorable
64 */
65 public class InlineableGraph implements Inlineable {
66
67 private final StructuredGraph graph;
68
69 private FixedNodeRelativeFrequencyCache probabilites = new FixedNodeRelativeFrequencyCache();
70
71 public InlineableGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context, CanonicalizerPhase canonicalizer, boolean trackNodeSourcePosition) {
72 StructuredGraph original = InliningUtil.getIntrinsicGraph(context.getReplacements(), method, invoke.bci(), trackNodeSourcePosition, null);
73 if (original == null) {
74 original = parseBytecodes(method, context, canonicalizer, invoke.asNode().graph(), trackNodeSourcePosition);
75 } else if (original.isFrozen()) {
76 // Graph may be modified by specializeGraphToArguments so defensively
77 // make a copy. We rely on the frozen state of a graph to denote
78 // whether it is shared.
79 original = (StructuredGraph) original.copy(invoke.asNode().getDebug());
80 }
81 this.graph = original;
82 specializeGraphToArguments(invoke, context, canonicalizer);
83 }
84
85 /**
86 * @return true iff one or more parameters <code>newGraph</code> were specialized to account for
87 * a constant argument, or an argument with a more specific stamp.
88 */
89 @SuppressWarnings("try")
|