84 import org.graalvm.compiler.nodes.PhiNode;
85 import org.graalvm.compiler.nodes.PiNode;
86 import org.graalvm.compiler.nodes.ReturnNode;
87 import org.graalvm.compiler.nodes.StartNode;
88 import org.graalvm.compiler.nodes.StateSplit;
89 import org.graalvm.compiler.nodes.StructuredGraph;
90 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
91 import org.graalvm.compiler.nodes.UnwindNode;
92 import org.graalvm.compiler.nodes.ValueNode;
93 import org.graalvm.compiler.nodes.calc.IsNullNode;
94 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
95 import org.graalvm.compiler.nodes.extended.GuardingNode;
96 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
97 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
98 import org.graalvm.compiler.nodes.java.MonitorExitNode;
99 import org.graalvm.compiler.nodes.java.MonitorIdNode;
100 import org.graalvm.compiler.nodes.spi.Replacements;
101 import org.graalvm.compiler.nodes.type.StampTool;
102 import org.graalvm.compiler.nodes.util.GraphUtil;
103 import org.graalvm.compiler.phases.common.inlining.info.InlineInfo;
104 import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener;
105 import org.graalvm.compiler.phases.util.ValueMergeUtil;
106
107 import jdk.vm.ci.code.BytecodeFrame;
108 import jdk.vm.ci.meta.Assumptions;
109 import jdk.vm.ci.meta.DeoptimizationAction;
110 import jdk.vm.ci.meta.DeoptimizationReason;
111 import jdk.vm.ci.meta.JavaKind;
112 import jdk.vm.ci.meta.ResolvedJavaMethod;
113 import jdk.vm.ci.meta.ResolvedJavaType;
114
115 public class InliningUtil extends ValueMergeUtil {
116
117 private static final String inliningDecisionsScopeString = "InliningDecisions";
118
119 /**
120 * Print a HotSpot-style inlining message to the console.
121 */
122 private static void printInlining(final InlineInfo info, final int inliningDepth, final boolean success, final String msg, final Object... args) {
123 printInlining(info.methodAt(0), info.invoke(), inliningDepth, success, msg, args);
124 }
490 /**
491 * Inline {@code inlineGraph} into the current replacing the node {@code Invoke} and return the
492 * set of nodes which should be canonicalized. The set should only contain nodes which modified
493 * by the inlining since the current graph and {@code inlineGraph} are expected to already be
494 * canonical.
495 *
496 * @param invoke
497 * @param inlineGraph
498 * @param receiverNullCheck
499 * @param inlineeMethod
500 * @return the set of nodes to canonicalize
501 */
502 @SuppressWarnings("try")
503 public static EconomicSet<Node> inlineForCanonicalization(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck, ResolvedJavaMethod inlineeMethod, String reason, String phase) {
504 return inlineForCanonicalization(invoke, inlineGraph, receiverNullCheck, inlineeMethod, null, reason, phase);
505 }
506
507 @SuppressWarnings("try")
508 public static EconomicSet<Node> inlineForCanonicalization(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck, ResolvedJavaMethod inlineeMethod,
509 Consumer<UnmodifiableEconomicMap<Node, Node>> duplicatesConsumer, String reason, String phase) {
510 HashSetNodeEventListener listener = new HashSetNodeEventListener();
511 /*
512 * This code relies on the fact that Graph.addDuplicates doesn't trigger the
513 * NodeEventListener to track only nodes which were modified into the process of inlining
514 * the graph into the current graph.
515 */
516 try (NodeEventScope nes = invoke.asNode().graph().trackNodeEvents(listener)) {
517 UnmodifiableEconomicMap<Node, Node> duplicates = InliningUtil.inline(invoke, inlineGraph, receiverNullCheck, inlineeMethod, reason, phase);
518 if (duplicatesConsumer != null) {
519 duplicatesConsumer.accept(duplicates);
520 }
521 }
522 return listener.getNodes();
523 }
524
525 @SuppressWarnings("try")
526 private static ValueNode finishInlining(Invoke invoke, StructuredGraph graph, FixedNode firstNode, List<ReturnNode> returnNodes, UnwindNode unwindNode, Assumptions inlinedAssumptions,
527 StructuredGraph inlineGraph) {
528 FixedNode invokeNode = invoke.asNode();
529 FrameState stateAfter = invoke.stateAfter();
530 assert stateAfter == null || stateAfter.isAlive();
|
84 import org.graalvm.compiler.nodes.PhiNode;
85 import org.graalvm.compiler.nodes.PiNode;
86 import org.graalvm.compiler.nodes.ReturnNode;
87 import org.graalvm.compiler.nodes.StartNode;
88 import org.graalvm.compiler.nodes.StateSplit;
89 import org.graalvm.compiler.nodes.StructuredGraph;
90 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
91 import org.graalvm.compiler.nodes.UnwindNode;
92 import org.graalvm.compiler.nodes.ValueNode;
93 import org.graalvm.compiler.nodes.calc.IsNullNode;
94 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
95 import org.graalvm.compiler.nodes.extended.GuardingNode;
96 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
97 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
98 import org.graalvm.compiler.nodes.java.MonitorExitNode;
99 import org.graalvm.compiler.nodes.java.MonitorIdNode;
100 import org.graalvm.compiler.nodes.spi.Replacements;
101 import org.graalvm.compiler.nodes.type.StampTool;
102 import org.graalvm.compiler.nodes.util.GraphUtil;
103 import org.graalvm.compiler.phases.common.inlining.info.InlineInfo;
104 import org.graalvm.compiler.phases.common.util.EconomicSetNodeEventListener;
105 import org.graalvm.compiler.phases.util.ValueMergeUtil;
106
107 import jdk.vm.ci.code.BytecodeFrame;
108 import jdk.vm.ci.meta.Assumptions;
109 import jdk.vm.ci.meta.DeoptimizationAction;
110 import jdk.vm.ci.meta.DeoptimizationReason;
111 import jdk.vm.ci.meta.JavaKind;
112 import jdk.vm.ci.meta.ResolvedJavaMethod;
113 import jdk.vm.ci.meta.ResolvedJavaType;
114
115 public class InliningUtil extends ValueMergeUtil {
116
117 private static final String inliningDecisionsScopeString = "InliningDecisions";
118
119 /**
120 * Print a HotSpot-style inlining message to the console.
121 */
122 private static void printInlining(final InlineInfo info, final int inliningDepth, final boolean success, final String msg, final Object... args) {
123 printInlining(info.methodAt(0), info.invoke(), inliningDepth, success, msg, args);
124 }
490 /**
491 * Inline {@code inlineGraph} into the current replacing the node {@code Invoke} and return the
492 * set of nodes which should be canonicalized. The set should only contain nodes which modified
493 * by the inlining since the current graph and {@code inlineGraph} are expected to already be
494 * canonical.
495 *
496 * @param invoke
497 * @param inlineGraph
498 * @param receiverNullCheck
499 * @param inlineeMethod
500 * @return the set of nodes to canonicalize
501 */
502 @SuppressWarnings("try")
503 public static EconomicSet<Node> inlineForCanonicalization(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck, ResolvedJavaMethod inlineeMethod, String reason, String phase) {
504 return inlineForCanonicalization(invoke, inlineGraph, receiverNullCheck, inlineeMethod, null, reason, phase);
505 }
506
507 @SuppressWarnings("try")
508 public static EconomicSet<Node> inlineForCanonicalization(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck, ResolvedJavaMethod inlineeMethod,
509 Consumer<UnmodifiableEconomicMap<Node, Node>> duplicatesConsumer, String reason, String phase) {
510 EconomicSetNodeEventListener listener = new EconomicSetNodeEventListener();
511 /*
512 * This code relies on the fact that Graph.addDuplicates doesn't trigger the
513 * NodeEventListener to track only nodes which were modified into the process of inlining
514 * the graph into the current graph.
515 */
516 try (NodeEventScope nes = invoke.asNode().graph().trackNodeEvents(listener)) {
517 UnmodifiableEconomicMap<Node, Node> duplicates = InliningUtil.inline(invoke, inlineGraph, receiverNullCheck, inlineeMethod, reason, phase);
518 if (duplicatesConsumer != null) {
519 duplicatesConsumer.accept(duplicates);
520 }
521 }
522 return listener.getNodes();
523 }
524
525 @SuppressWarnings("try")
526 private static ValueNode finishInlining(Invoke invoke, StructuredGraph graph, FixedNode firstNode, List<ReturnNode> returnNodes, UnwindNode unwindNode, Assumptions inlinedAssumptions,
527 StructuredGraph inlineGraph) {
528 FixedNode invokeNode = invoke.asNode();
529 FrameState stateAfter = invoke.stateAfter();
530 assert stateAfter == null || stateAfter.isAlive();
|