src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java
changeset 58877 aec7bf35d6f5
parent 58299 6df94ce3ab2f
equal deleted inserted replaced
58876:1a8d65e71a66 58877:aec7bf35d6f5
    54 import org.graalvm.compiler.graph.Node;
    54 import org.graalvm.compiler.graph.Node;
    55 import org.graalvm.compiler.graph.NodeInputList;
    55 import org.graalvm.compiler.graph.NodeInputList;
    56 import org.graalvm.compiler.graph.NodeMap;
    56 import org.graalvm.compiler.graph.NodeMap;
    57 import org.graalvm.compiler.graph.NodeSourcePosition;
    57 import org.graalvm.compiler.graph.NodeSourcePosition;
    58 import org.graalvm.compiler.graph.NodeWorkList;
    58 import org.graalvm.compiler.graph.NodeWorkList;
       
    59 import org.graalvm.compiler.nodeinfo.InputType;
    59 import org.graalvm.compiler.nodeinfo.Verbosity;
    60 import org.graalvm.compiler.nodeinfo.Verbosity;
    60 import org.graalvm.compiler.nodes.AbstractBeginNode;
    61 import org.graalvm.compiler.nodes.AbstractBeginNode;
    61 import org.graalvm.compiler.nodes.AbstractEndNode;
    62 import org.graalvm.compiler.nodes.AbstractEndNode;
    62 import org.graalvm.compiler.nodes.AbstractMergeNode;
    63 import org.graalvm.compiler.nodes.AbstractMergeNode;
    63 import org.graalvm.compiler.nodes.BeginNode;
    64 import org.graalvm.compiler.nodes.BeginNode;
    85 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
    86 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
    86 import org.graalvm.compiler.nodes.UnwindNode;
    87 import org.graalvm.compiler.nodes.UnwindNode;
    87 import org.graalvm.compiler.nodes.ValueNode;
    88 import org.graalvm.compiler.nodes.ValueNode;
    88 import org.graalvm.compiler.nodes.calc.IsNullNode;
    89 import org.graalvm.compiler.nodes.calc.IsNullNode;
    89 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
    90 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
       
    91 import org.graalvm.compiler.nodes.extended.GuardedNode;
    90 import org.graalvm.compiler.nodes.extended.GuardingNode;
    92 import org.graalvm.compiler.nodes.extended.GuardingNode;
    91 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
    93 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
    92 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
    94 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
    93 import org.graalvm.compiler.nodes.java.MonitorExitNode;
    95 import org.graalvm.compiler.nodes.java.MonitorExitNode;
    94 import org.graalvm.compiler.nodes.java.MonitorIdNode;
    96 import org.graalvm.compiler.nodes.java.MonitorIdNode;
   524             InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) invoke);
   526             InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) invoke);
   525             if (unwindNode != null && unwindNode.isAlive()) {
   527             if (unwindNode != null && unwindNode.isAlive()) {
   526                 assert unwindNode.predecessor() != null;
   528                 assert unwindNode.predecessor() != null;
   527                 assert invokeWithException.exceptionEdge().successors().count() == 1;
   529                 assert invokeWithException.exceptionEdge().successors().count() == 1;
   528                 ExceptionObjectNode obj = (ExceptionObjectNode) invokeWithException.exceptionEdge();
   530                 ExceptionObjectNode obj = (ExceptionObjectNode) invokeWithException.exceptionEdge();
   529                 obj.replaceAtUsages(unwindNode.exception());
   531                 /*
       
   532                  * The exception object node is a begin node, i.e., it can be used as an anchor for
       
   533                  * other nodes, thus we need to re-route them to a valid anchor, i.e. the begin node
       
   534                  * of the unwind block.
       
   535                  */
       
   536                 assert obj.usages().filter(x -> x instanceof GuardedNode && ((GuardedNode) x).getGuard() == obj).count() == 0 : "Must not have guards attached to an exception object node";
       
   537                 AbstractBeginNode replacementAnchor = AbstractBeginNode.prevBegin(unwindNode);
       
   538                 assert replacementAnchor != null;
       
   539                 obj.replaceAtUsages(InputType.Anchor, replacementAnchor);
       
   540                 obj.replaceAtUsages(InputType.Value, unwindNode.exception());
       
   541 
   530                 Node n = obj.next();
   542                 Node n = obj.next();
   531                 obj.setNext(null);
   543                 obj.setNext(null);
   532                 unwindNode.replaceAndDelete(n);
   544                 unwindNode.replaceAndDelete(n);
   533 
   545 
   534                 obj.replaceAtPredecessor(null);
   546                 obj.replaceAtPredecessor(null);