changeset 9672:67804a97c1ce

allow inlining of invokes with a null stateAfter
author Doug Simon <doug.simon@oracle.com>
date Mon, 13 May 2013 19:00:24 +0200
parents 0b3d19e4e2a2
children 37ec49e1d7e2
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java
diffstat 1 files changed, 29 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Mon May 13 14:54:30 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Mon May 13 19:00:24 2013 +0200
@@ -1161,7 +1161,7 @@
         StructuredGraph graph = invoke.asNode().graph();
 
         FrameState stateAfter = invoke.stateAfter();
-        assert stateAfter.isAlive();
+        assert stateAfter == null || stateAfter.isAlive();
 
         IdentityHashMap<Node, Node> replacements = new IdentityHashMap<>();
         ArrayList<Node> nodes = new ArrayList<>();
@@ -1234,39 +1234,40 @@
             }
         }
 
-        FrameState outerFrameState = null;
-        int callerLockDepth = stateAfter.nestedLockDepth();
-        for (Node node : duplicates.values()) {
-            if (node instanceof FrameState) {
-                FrameState frameState = (FrameState) node;
-                assert frameState.bci != FrameState.BEFORE_BCI : frameState;
-                if (frameState.bci == FrameState.AFTER_BCI) {
-                    frameState.replaceAndDelete(stateAfter);
-                } else if (frameState.bci == FrameState.AFTER_EXCEPTION_BCI) {
-                    if (frameState.isAlive()) {
-                        assert stateAtExceptionEdge != null;
-                        frameState.replaceAndDelete(stateAtExceptionEdge);
+        if (stateAfter != null) {
+            FrameState outerFrameState = null;
+            int callerLockDepth = stateAfter.nestedLockDepth();
+            for (Node node : duplicates.values()) {
+                if (node instanceof FrameState) {
+                    FrameState frameState = (FrameState) node;
+                    assert frameState.bci != FrameState.BEFORE_BCI : frameState;
+                    if (frameState.bci == FrameState.AFTER_BCI) {
+                        frameState.replaceAndDelete(stateAfter);
+                    } else if (frameState.bci == FrameState.AFTER_EXCEPTION_BCI) {
+                        if (frameState.isAlive()) {
+                            assert stateAtExceptionEdge != null;
+                            frameState.replaceAndDelete(stateAtExceptionEdge);
+                        } else {
+                            assert stateAtExceptionEdge == null;
+                        }
                     } else {
-                        assert stateAtExceptionEdge == null;
-                    }
-                } else {
-                    // only handle the outermost frame states
-                    if (frameState.outerFrameState() == null) {
-                        assert frameState.bci == FrameState.INVALID_FRAMESTATE_BCI || frameState.method() == inlineGraph.method();
-                        if (outerFrameState == null) {
-                            outerFrameState = stateAfter.duplicateModified(invoke.bci(), stateAfter.rethrowException(), invoke.asNode().kind());
-                            outerFrameState.setDuringCall(true);
+                        // only handle the outermost frame states
+                        if (frameState.outerFrameState() == null) {
+                            assert frameState.bci == FrameState.INVALID_FRAMESTATE_BCI || frameState.method() == inlineGraph.method();
+                            if (outerFrameState == null) {
+                                outerFrameState = stateAfter.duplicateModified(invoke.bci(), stateAfter.rethrowException(), invoke.asNode().kind());
+                                outerFrameState.setDuringCall(true);
+                            }
+                            frameState.setOuterFrameState(outerFrameState);
                         }
-                        frameState.setOuterFrameState(outerFrameState);
                     }
                 }
-            }
-            if (callerLockDepth != 0 && node instanceof MonitorReference) {
-                MonitorReference monitor = (MonitorReference) node;
-                monitor.setLockDepth(monitor.getLockDepth() + callerLockDepth);
+                if (callerLockDepth != 0 && node instanceof MonitorReference) {
+                    MonitorReference monitor = (MonitorReference) node;
+                    monitor.setLockDepth(monitor.getLockDepth() + callerLockDepth);
+                }
             }
         }
-
         Node returnValue = null;
         if (returnNode != null) {
             if (returnNode.result() instanceof LocalNode) {