changeset 3055:fecdb0a65fb2

runtime profiles exceptions at the call site
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 21 Jun 2011 11:13:52 +0200
parents abcc480f3bd5
children 2e20c39e472f
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.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.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java src/cpu/x86/vm/c1_globals_x86.hpp src/share/vm/graal/graalCompiler.cpp src/share/vm/graal/graalJavaAccess.hpp src/share/vm/graal/graalVMEntries.cpp src/share/vm/interpreter/interpreterRuntime.cpp src/share/vm/runtime/sharedRuntime.cpp
diffstat 14 files changed, 84 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java	Tue Jun 21 11:13:52 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/phases/GraphBuilderPhase.java	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 21 11:13:52 2011 +0200
@@ -384,6 +384,10 @@
     private Instruction handleException(Value exceptionObject, int bci) {
         assert bci == Instruction.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci";
 
+        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	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Tue Jun 21 11:13:52 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.*;
@@ -407,6 +408,11 @@
                 obj.setNext(null);
                 unwindDuplicate.replace(n);
             }
+        } else {
+            if (unwindNode != null) {
+                Unwind unwindDuplicate = (Unwind) duplicates.get(unwindNode);
+                unwindDuplicate.replace(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            }
         }
 
         // adjust all frame states that were copied
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java	Tue Jun 21 11:13:52 2011 +0200
@@ -42,7 +42,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;
@@ -53,7 +52,6 @@
         accessFlags = -1;
         maxLocals = -1;
         maxStackSize = -1;
-        invocationCount = -1;
     }
 
     @Override
@@ -172,7 +170,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;
     }
 
@@ -192,7 +190,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) {
@@ -208,6 +210,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	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java	Tue Jun 21 11:13:52 2011 +0200
@@ -165,6 +165,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	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java	Tue Jun 21 11:13:52 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/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java	Mon Jun 20 11:47:57 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java	Tue Jun 21 11:13:52 2011 +0200
@@ -140,6 +140,7 @@
         if (!compileMethods) {
             return;
         }
+        ((HotSpotMethodResolvedImpl) method).dumpProfile();
 
         new Sandbox() {
             @Override
--- a/src/cpu/x86/vm/c1_globals_x86.hpp	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/cpu/x86/vm/c1_globals_x86.hpp	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/share/vm/graal/graalCompiler.cpp	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/share/vm/graal/graalVMEntries.cpp	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/share/vm/interpreter/interpreterRuntime.cpp	Tue Jun 21 11:13:52 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	Mon Jun 20 11:47:57 2011 +0200
+++ b/src/share/vm/runtime/sharedRuntime.cpp	Tue Jun 21 11:13:52 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