changeset 3062:848dd57066ad

Merge
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Tue, 21 Jun 2011 17:14:24 +0200
parents 00239c259a42 (current diff) f08a810b8449 (diff)
children 726dcfd2d91e 8b0236cbed14 8188167cbb0f
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java
diffstat 21 files changed, 125 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Tue Jun 21 17:14:24 2011 +0200
@@ -113,6 +113,8 @@
     public static boolean GenLIR                             = true;
     public static boolean GenCode                            = true;
     public static boolean UseBranchPrediction                = true;
+    public static boolean UseExceptionProbability            = ____;
+    public static int     MatureInvocationCount              = 100;
 
     public static boolean UseConstDirectCall                 = ____;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Jun 21 17:14:24 2011 +0200
@@ -156,7 +156,7 @@
         }
 
         for (Node node : graph.getNodes()) {
-            if (node == Node.Null || omittedClasses.contains(node.getClass())) {
+            if (omittedClasses.contains(node.getClass())) {
                 continue;
             }
 
@@ -250,9 +250,6 @@
 
         if (nodeToBlock != null) {
             for (Node n : graph.getNodes()) {
-                if (n == null) {
-                    continue;
-                }
                 Block blk = nodeToBlock.get(n);
                 if (blk == block) {
                     nodes.add(n);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java	Tue Jun 21 17:14:24 2011 +0200
@@ -23,6 +23,7 @@
 package com.oracle.max.graal.compiler.debug;
 
 import java.io.*;
+import java.util.*;
 
 import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.util.*;
@@ -444,7 +445,7 @@
      */
     public LogStream printf(String format, Object... args) {
         if (ps != null) {
-            print(String.format(format, args));
+            print(String.format(Locale.ENGLISH, format, args));
         }
         return this;
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Tue Jun 21 17:14:24 2011 +0200
@@ -99,6 +99,8 @@
             new CanonicalizerPhase().apply(graph);
             new DeadCodeEliminationPhase().apply(graph);
         }
+//
+//        new EscapeAnalysisPhase().apply(graph);
 
         if (GraalOptions.OptLoops) {
             new LoopPhase().apply(graph);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -104,7 +104,7 @@
 
     private void disconnectCFGNodes() {
         for (Node node : graph.getNodes()) {
-            if (node != Node.Null && !flood.isMarked(node)) {
+            if (!flood.isMarked(node)) {
                 if (node instanceof EndNode) {
                     EndNode end = (EndNode) node;
                     Merge merge = end.merge();
@@ -131,7 +131,7 @@
 
     private void deleteNodes() {
         for (Node node : graph.getNodes()) {
-            if (node != Node.Null && !flood.isMarked(node)) {
+            if (!flood.isMarked(node)) {
                 node.unsafeDelete();
             }
         }
@@ -142,7 +142,7 @@
             if (node instanceof Local) {
                 flood.add(node);
             }
-            if (node != Node.Null && flood.isMarked(node)) {
+            if (flood.isMarked(node)) {
                 for (Node input : node.inputs()) {
                     flood.add(input);
                 }
@@ -157,7 +157,7 @@
 
     private void disconnectNodes() {
         for (Node node : graph.getNodes()) {
-            if (node != Node.Null && !flood.isMarked(node)) {
+            if (!flood.isMarked(node)) {
                 for (int i = 0; i < node.inputs().size(); i++) {
                     Node input = node.inputs().get(i);
                     if (input != Node.Null && flood.isMarked(input)) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DuplicationPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DuplicationPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -49,7 +49,7 @@
 
         // Delete nodes in original graph.
         for (Node n : graph.getNodes()) {
-            if (n != null && n != graph.start()) {
+            if (n != graph.start()) {
                 n.forceDelete();
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -387,6 +387,12 @@
     private FixedNode handleException(Value exceptionObject, int bci) {
         assert bci == Instruction.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci";
 
+        if (GraalOptions.UseExceptionProbability && method.invocationCount() > GraalOptions.MatureInvocationCount) {
+            if (exceptionObject == null && method.exceptionProbability(bci) == 0) {
+                return null;
+            }
+        }
+
         RiExceptionHandler firstHandler = null;
         // join with all potential exception handlers
         if (exceptionHandlers != null) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -29,6 +29,7 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.graph.*;
 import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
 import com.oracle.max.graal.compiler.value.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -321,20 +322,18 @@
         Unwind unwindNode = null;
         StartNode startNode = graph.start();
         for (Node node : graph.getNodes()) {
-            if (node != null) {
-                if (node instanceof StartNode) {
-                    assert startNode == node;
-                } else if (node instanceof Local) {
-                    replacements.put(node, parameters[((Local) node).index()]);
-                } else {
-                    nodes.add(node);
-                    if (node instanceof Return) {
-                        returnNode = (Return) node;
-                    } else if (node instanceof Unwind) {
-                        unwindNode = (Unwind) node;
-                    } else if (node instanceof FrameState) {
-                        frameStates.add(node);
-                    }
+            if (node instanceof StartNode) {
+                assert startNode == node;
+            } else if (node instanceof Local) {
+                replacements.put(node, parameters[((Local) node).index()]);
+            } else {
+                nodes.add(node);
+                if (node instanceof Return) {
+                    returnNode = (Return) node;
+                } else if (node instanceof Unwind) {
+                    unwindNode = (Unwind) node;
+                } else if (node instanceof FrameState) {
+                    frameStates.add(node);
                 }
             }
         }
@@ -410,6 +409,11 @@
                 obj.setNext(null);
                 unwindDuplicate.replace(n);
             }
+        } else {
+            if (unwindNode != null) {
+                Unwind unwindDuplicate = (Unwind) duplicates.get(unwindNode);
+                unwindDuplicate.replace(new Deoptimize(DeoptAction.InvalidateRecompile, compilation.graph));
+            }
         }
 
         // adjust all frame states that were copied
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -35,11 +35,8 @@
 
     @Override
     protected void run(Graph graph) {
-        List<Node> nodes = new ArrayList<Node>(graph.getNodes());
-        for (Node n : nodes) {
-            if (n instanceof LoopBegin) {
-                doLoop((LoopBegin) n);
-            }
+        for (LoopBegin n : graph.getNodes(LoopBegin.class)) {
+            doLoop(n);
         }
     }
 
@@ -76,7 +73,7 @@
                         IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph);
                         IntegerAdd addStride = new IntegerAdd(kind, sub, c1.stride(), graph);
                         IntegerAdd add = new IntegerAdd(kind, c1, addStride, graph);
-                        Phi phi = new Phi(kind, loopBegin, graph); // TODO (gd) assumes order on loopBegin preds
+                        Phi phi = new Phi(kind, loopBegin, graph); // (gd) assumes order on loopBegin preds - works in collab with graph builder
                         phi.addInput(c2.init());
                         phi.addInput(add);
                         c2.replace(phi);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Tue Jun 21 17:14:24 2011 +0200
@@ -112,22 +112,20 @@
 
         // Identify blocks.
         for (Node n : graph.getNodes()) {
-            if (n != null) {
-                if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) {
-                    Block block = null;
-                    Node currentNode = n;
-                    while (nodeToBlock.get(currentNode) == null) {
-                        if (block != null && (currentNode instanceof ControlSplit || trueSuccessorCount(currentNode) > 1)) {
-                            // We are at a split node => start a new block.
-                            block = null;
-                        }
-                        block = assignBlockNew(currentNode, block);
-                        if (currentNode.predecessors().size() == 0) {
-                            // Either dead code or at a merge node => stop iteration.
-                            break;
-                        }
-                        currentNode = currentNode.singlePredecessor();
+            if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) {
+                Block block = null;
+                Node currentNode = n;
+                while (nodeToBlock.get(currentNode) == null) {
+                    if (block != null && (currentNode instanceof ControlSplit || trueSuccessorCount(currentNode) > 1)) {
+                        // We are at a split node => start a new block.
+                        block = null;
                     }
+                    block = assignBlockNew(currentNode, block);
+                    if (currentNode.predecessors().size() == 0) {
+                        // Either dead code or at a merge node => stop iteration.
+                        break;
+                    }
+                    currentNode = currentNode.singlePredecessor();
                 }
             }
         }
--- a/graal/com.oracle.max.graal.graphviz/src/com/oracle/max/graal/graphviz/GraphvizPrinter.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.graphviz/src/com/oracle/max/graal/graphviz/GraphvizPrinter.java	Tue Jun 21 17:14:24 2011 +0200
@@ -92,9 +92,7 @@
     public void print(Graph graph, boolean shortNames) {
         // graph.getNodes() returns all the graph's nodes, not just "roots"
         for (Node n : graph.getNodes()) {
-            if (n != null) {
-                printNode(n, shortNames);
-            }
+            printNode(n, shortNames);
         }
     }
 
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java	Tue Jun 21 17:14:24 2011 +0200
@@ -43,7 +43,6 @@
     private final int accessFlags;
     private final int maxLocals;
     private final int maxStackSize;
-    private final int invocationCount;
     private RiExceptionHandler[] exceptionHandlers;
     private RiSignature signature;
     private Boolean hasBalancedMonitors;
@@ -54,7 +53,6 @@
         accessFlags = -1;
         maxLocals = -1;
         maxStackSize = -1;
-        invocationCount = -1;
     }
 
     @Override
@@ -173,7 +171,7 @@
 
     public boolean hasCompiledCode() {
         // TODO: needs a VMEntries to go cache the result of that method.
-        // This isn't used by GRAAL for now, so this is enough.
+        // This isn't used by GRAAL for now, so this is enough.throwoutCount
         return false;
     }
 
@@ -193,7 +191,11 @@
     }
 
     public int invocationCount() {
-        return invocationCount;
+        return compiler.getVMEntries().RiMethod_invocationCount(this);
+    }
+
+    public int exceptionProbability(int bci) {
+        return compiler.getVMEntries().RiMethod_exceptionProbability(this, bci);
     }
 
     public RiTypeProfile typeProfile(int bci) {
@@ -209,6 +211,9 @@
         TTY.println("canBeStaticallyBound: " + canBeStaticallyBound());
         TTY.println("invocationCount: " + invocationCount());
         for (int i = 0; i < codeSize(); i++) {
+            if (exceptionProbability(i) != -1) {
+                TTY.println("exceptionProbability@%d: %d", i, exceptionProbability(i));
+            }
             if (branchProbability(i) != -1) {
                 TTY.println("branchProbability@%d: %d", i, branchProbability(i));
             }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java	Tue Jun 21 17:14:24 2011 +0200
@@ -166,6 +166,10 @@
         return -1;
     }
 
+    public int exceptionProbability(int bci) {
+        return -1;
+    }
+
     public RiTypeProfile typeProfile(int bci) {
         return null;
     }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java	Tue Jun 21 17:14:24 2011 +0200
@@ -45,6 +45,8 @@
 
     int RiMethod_invocationCount(HotSpotMethodResolved method);
 
+    int RiMethod_exceptionProbability(HotSpotMethodResolved method, int bci);
+
     RiTypeProfile RiMethod_typeProfile(HotSpotMethodResolved method, int bci);
 
     int RiMethod_branchProbability(HotSpotMethodResolved method, int bci);
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java	Tue Jun 21 16:58:34 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java	Tue Jun 21 17:14:24 2011 +0200
@@ -54,6 +54,9 @@
     public native int RiMethod_invocationCount(HotSpotMethodResolved method);
 
     @Override
+    public native int RiMethod_exceptionProbability(HotSpotMethodResolved method, int bci);
+
+    @Override
     public native RiTypeProfile RiMethod_typeProfile(HotSpotMethodResolved method, int bci);
 
     @Override
--- a/src/cpu/x86/vm/c1_globals_x86.hpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/cpu/x86/vm/c1_globals_x86.hpp	Tue Jun 21 17:14:24 2011 +0200
@@ -37,7 +37,7 @@
 define_pd_global(bool, ResizeTLAB,                   true );
 define_pd_global(bool, InlineIntrinsics,             true );
 define_pd_global(bool, PreferInterpreterNativeStubs, false);
-define_pd_global(bool, ProfileTraps,                 false);
+define_pd_global(bool, ProfileTraps,                 true );
 define_pd_global(bool, UseOnStackReplacement,        true );
 define_pd_global(bool, TieredCompilation,            false);
 define_pd_global(intx, CompileThreshold,             5000 );   // changed for GRAAL
--- a/src/share/vm/graal/graalCompiler.cpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/share/vm/graal/graalCompiler.cpp	Tue Jun 21 17:14:24 2011 +0200
@@ -222,7 +222,6 @@
   HotSpotMethodResolved::set_accessFlags(obj, method->access_flags().as_int());
   HotSpotMethodResolved::set_maxLocals(obj, method->max_locals());
   HotSpotMethodResolved::set_maxStackSize(obj, method->max_stack());
-  HotSpotMethodResolved::set_invocationCount(obj, method->invocation_count());
   
   method->set_graal_mirror(obj());
   return obj();
--- a/src/share/vm/graal/graalJavaAccess.hpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Tue Jun 21 17:14:24 2011 +0200
@@ -68,7 +68,6 @@
     int_field(HotSpotMethodResolved, accessFlags)                                       \
     int_field(HotSpotMethodResolved, maxLocals)                                         \
     int_field(HotSpotMethodResolved, maxStackSize)                                      \
-    int_field(HotSpotMethodResolved, invocationCount)                                   \
   end_class                                                                             \
   start_class(HotSpotType)                                                              \
     oop_field(HotSpotType, name, "Ljava/lang/String;")                                  \
--- a/src/share/vm/graal/graalVMEntries.cpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/share/vm/graal/graalVMEntries.cpp	Tue Jun 21 17:14:24 2011 +0200
@@ -183,8 +183,35 @@
   return method->invocation_count();
 }
 
+// public native int RiMethod_throwoutCount(long vmId);
+JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2exceptionProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) {
+  TRACE_graal_3("VMEntries::RiMethod_exceptionProbability");
+  ciMethod* cimethod;
+  {
+    VM_ENTRY_MARK;
+    methodOop method = getMethodFromHotSpotMethod(hotspot_method);
+    cimethod = (ciMethod*)CURRENT_ENV->get_object(method);
+  }
+
+  ciMethodData* method_data = cimethod->method_data_or_null();
+  if (method_data == NULL) {
+    return -1;
+  } else {
+    ciProfileData* profile = method_data->bci_to_data(bci);
+    if (profile == NULL) {
+      return 0;
+    }
+    uint trap = method_data->trap_recompiled_at(profile);
+    if (trap > 0) {
+      return 100;
+    } else {
+      return trap;
+    }
+  }
+}
+
 // public native RiTypeProfile RiMethod_typeProfile(long vmId, int bci);
-JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile(JNIEnv *, jobject, jobject hotspot_method, jint bci) {
+JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2typeProfile(JNIEnv *, jobject, jobject hotspot_method, jint bci) {
   TRACE_graal_3("VMEntries::RiMethod_typeProfile");
   ciMethod* cimethod;
   {
@@ -225,7 +252,7 @@
 }
 
 // public native RiTypeProfile RiMethod_branchProfile(long vmId, int bci);
-JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) {
+JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_2branchProbability(JNIEnv *, jobject, jobject hotspot_method, jint bci) {
   TRACE_graal_3("VMEntries::RiMethod_typeProfile");
   ciMethodData* method_data;
   ciMethod* cimethod;
@@ -803,9 +830,10 @@
   {CC"RiMethod_exceptionHandlers",      CC"("RESOLVED_METHOD")"EXCEPTION_HANDLERS,  FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1exceptionHandlers)},
   {CC"RiMethod_hasBalancedMonitors",    CC"("RESOLVED_METHOD")Z",                   FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1hasBalancedMonitors)},
   {CC"RiMethod_uniqueConcreteMethod",   CC"("RESOLVED_METHOD")"METHOD,              FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1uniqueConcreteMethod)},
-  {CC"RiMethod_typeProfile",            CC"("RESOLVED_METHOD"I)"TYPE_PROFILE,       FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile)},
-  {CC"RiMethod_branchProbability",      CC"("RESOLVED_METHOD"I)I",                  FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability)},
+  {CC"RiMethod_typeProfile",            CC"("RESOLVED_METHOD"I)"TYPE_PROFILE,       FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2typeProfile)},
+  {CC"RiMethod_branchProbability",      CC"("RESOLVED_METHOD"I)I",                  FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2branchProbability)},
   {CC"RiMethod_invocationCount",        CC"("RESOLVED_METHOD")I",                   FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount)},
+  {CC"RiMethod_exceptionProbability",   CC"("RESOLVED_METHOD"I)I",                  FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_2exceptionProbability)},
   {CC"RiSignature_lookupType",          CC"("STRING RESOLVED_TYPE")"TYPE,           FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType)},
   {CC"RiConstantPool_lookupConstant",   CC"("PROXY"I)"OBJECT,                       FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupConstant)},
   {CC"RiConstantPool_lookupMethod",     CC"("PROXY"IB)"METHOD,                      FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupMethod)},
--- a/src/share/vm/interpreter/interpreterRuntime.cpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/share/vm/interpreter/interpreterRuntime.cpp	Tue Jun 21 17:14:24 2011 +0200
@@ -458,6 +458,17 @@
     }
   } while (should_repeat == true);
 
+  if (h_method->method_data() != NULL) {
+    ProfileData* pdata = h_method->method_data()->allocate_bci_to_data(current_bci);
+    if (pdata != NULL) {
+      int tstate0 = pdata->trap_state();
+      int tstate1 = Deoptimization::trap_state_set_recompiled(tstate0, true);
+      if (tstate1 != tstate0) {
+        pdata->set_trap_state(tstate1);
+      }
+    }
+  }
+
   // notify JVMTI of an exception throw; JVMTI will detect if this is a first
   // time throw or a stack unwinding throw and accordingly notify the debugger
   if (JvmtiExport::can_post_on_exceptions()) {
--- a/src/share/vm/runtime/sharedRuntime.cpp	Tue Jun 21 16:58:34 2011 +0200
+++ b/src/share/vm/runtime/sharedRuntime.cpp	Tue Jun 21 17:14:24 2011 +0200
@@ -636,8 +636,15 @@
 
 #ifdef COMPILER1
   if (t == NULL && nm->is_compiled_by_c1()) {
-    assert(nm->unwind_handler_begin() != NULL, "");
-    return nm->unwind_handler_begin();
+    if (UseGraal) {
+      nm->make_not_entrant();
+      JavaThread::current()->set_exception_pc(ret_pc);
+      JavaThread::current()->set_exception_oop(exception());
+      return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
+    } else {
+      assert(nm->unwind_handler_begin() != NULL, "");
+      return nm->unwind_handler_begin();
+    }
   }
 #endif