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