changeset 4692:9d48ccb39292

Fixed a wrong frame state for the exception edge after a polymorphic inlining. Removed a NPE allocation in a runtime call branch introduced for Graal.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 24 Feb 2012 22:32:43 +0100
parents fc42b5b6941a
children 07bcee8b70a4
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/DebugInfoBuilder.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java src/share/vm/c1/c1_Runtime1.cpp
diffstat 4 files changed, 5 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/DebugInfoBuilder.java	Fri Feb 24 20:39:12 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/DebugInfoBuilder.java	Fri Feb 24 22:32:43 2012 +0100
@@ -135,6 +135,7 @@
                 throw new CiBailout("unbalanced monitors: found monitor for unknown frame");
             }
         }
+        assert state.bci >= 0 || state.bci == FrameState.BEFORE_BCI;
         CiFrame frame = new CiFrame(caller, state.method(), state.bci, state.rethrowException(), state.duringCall(), values, state.localsSize(), state.stackSize(), numLocks);
         return frame;
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java	Fri Feb 24 20:39:12 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java	Fri Feb 24 22:32:43 2012 +0100
@@ -29,11 +29,13 @@
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.cri.ri.*;
 import com.oracle.max.cri.ri.RiType.Representation;
+import com.oracle.max.criutils.*;
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.phases.*;
 import com.oracle.max.graal.cri.*;
 import com.oracle.max.graal.debug.*;
 import com.oracle.max.graal.graph.*;
+import com.oracle.max.graal.graph.Node.Verbosity;
 import com.oracle.max.graal.nodes.*;
 import com.oracle.max.graal.nodes.DeoptimizeNode.DeoptAction;
 import com.oracle.max.graal.nodes.PhiNode.PhiType;
@@ -281,11 +283,11 @@
 
                 exceptionMerge = graph.add(new MergeNode());
                 exceptionMerge.setProbability(exceptionEdge.probability());
-                exceptionMerge.setStateAfter(exceptionEdge.stateAfter().duplicate(invoke.stateAfter().bci));
 
                 FixedNode exceptionSux = exceptionObject.next();
                 graph.addBeforeFixed(exceptionSux, exceptionMerge);
                 exceptionObjectPhi = graph.unique(new PhiNode(CiKind.Object, exceptionMerge, PhiType.Value));
+                exceptionMerge.setStateAfter(exceptionEdge.stateAfter().duplicateModified(invoke.stateAfter().bci, true, CiKind.Void, exceptionObjectPhi));
             }
 
             // create one separate block for each invoked method
--- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Fri Feb 24 20:39:12 2012 +0100
+++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Fri Feb 24 22:32:43 2012 +0100
@@ -359,6 +359,7 @@
             }
         }
 
+        // TODO(tw): Merge BeginNode with ExceptionObject node to get a correct and uniform FrameState.
         BeginNode p = currentGraph.add(new BeginNode());
         p.setStateAfter(frameState.duplicateWithoutStack(bci));
 
--- a/src/share/vm/c1/c1_Runtime1.cpp	Fri Feb 24 20:39:12 2012 +0100
+++ b/src/share/vm/c1/c1_Runtime1.cpp	Fri Feb 24 22:32:43 2012 +0100
@@ -462,11 +462,6 @@
   thread->set_is_method_handle_return(false);
 
   Handle exception(thread, ex);
-#ifdef GRAAL
-  if (exception.is_null()) {
-    exception = Exceptions::new_exception(thread, vmSymbols::java_lang_NullPointerException(), NULL);
-  }
-#endif
   nm = CodeCache::find_nmethod(pc);
   assert(nm != NULL, "this is not an nmethod");
   // Adjust the pc as needed/