< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java

Print this page
rev 52509 : [mq]: graal2


  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();


< prev index next >