# HG changeset patch # User Lukas Stadler # Date 1308647632 -7200 # Node ID fecdb0a65fb2c6aaf4fb338a7e850b36180e60c7 # Parent abcc480f3bd5077341e753598c843906fe55ed9f runtime profiles exceptions at the call site diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/LogStream.java --- 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; } diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- 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) { diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- 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 diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodResolvedImpl.java --- 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)); } diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotMethodUnresolved.java --- 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; } diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntries.java --- 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); diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMEntriesNative.java --- 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 diff -r abcc480f3bd5 -r fecdb0a65fb2 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java --- 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 diff -r abcc480f3bd5 -r fecdb0a65fb2 src/cpu/x86/vm/c1_globals_x86.hpp --- 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 diff -r abcc480f3bd5 -r fecdb0a65fb2 src/share/vm/graal/graalCompiler.cpp --- 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(); diff -r abcc480f3bd5 -r fecdb0a65fb2 src/share/vm/graal/graalJavaAccess.hpp --- 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;") \ diff -r abcc480f3bd5 -r fecdb0a65fb2 src/share/vm/graal/graalVMEntries.cpp --- 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)}, diff -r abcc480f3bd5 -r fecdb0a65fb2 src/share/vm/interpreter/interpreterRuntime.cpp --- 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()) { diff -r abcc480f3bd5 -r fecdb0a65fb2 src/share/vm/runtime/sharedRuntime.cpp --- 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