Mercurial > hg > truffle
comparison src/share/vm/graal/graalVMToCompiler.cpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | 8bbbde9d0a52 |
children | 2dc020b33a6e |
comparison
equal
deleted
inserted
replaced
9125:5b25562f8bd7 | 9126:bc26f978b0ce |
---|---|
206 JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::createUnresolvedJavaType_name(), vmSymbols::createUnresolvedJavaType_signature(), &args, THREAD); | 206 JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::createUnresolvedJavaType_name(), vmSymbols::createUnresolvedJavaType_signature(), &args, THREAD); |
207 check_pending_exception("Error while calling createUnresolvedJavaType"); | 207 check_pending_exception("Error while calling createUnresolvedJavaType"); |
208 return (oop) result.get_jobject(); | 208 return (oop) result.get_jobject(); |
209 } | 209 } |
210 | 210 |
211 oop VMToCompiler::createResolvedJavaType(Klass* klass, Handle name, Handle simpleName, Handle java_mirror, jboolean hasFinalizableSubclass, jint sizeOrSpecies, TRAPS) { | 211 oop VMToCompiler::createResolvedJavaType(Klass* klass, Handle name, Handle simpleName, Handle java_mirror, jint sizeOrSpecies, TRAPS) { |
212 assert(!name.is_null(), "just checking"); | 212 assert(!name.is_null(), "just checking"); |
213 assert(!simpleName.is_null(), "just checking"); | 213 assert(!simpleName.is_null(), "just checking"); |
214 JavaValue result(T_OBJECT); | 214 JavaValue result(T_OBJECT); |
215 JavaCallArguments args; | 215 JavaCallArguments args; |
216 args.push_oop(instance()); | 216 args.push_oop(instance()); |
217 args.push_long((jlong) (address) klass); | 217 args.push_long((jlong) (address) klass); |
218 args.push_oop(name); | 218 args.push_oop(name); |
219 args.push_oop(simpleName); | 219 args.push_oop(simpleName); |
220 args.push_oop(java_mirror); | 220 args.push_oop(java_mirror); |
221 args.push_int(hasFinalizableSubclass); | |
222 args.push_int(sizeOrSpecies); | 221 args.push_int(sizeOrSpecies); |
223 JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::createResolvedJavaType_name(), vmSymbols::createResolvedJavaType_signature(), &args, THREAD); | 222 JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::createResolvedJavaType_name(), vmSymbols::createResolvedJavaType_signature(), &args, THREAD); |
224 check_pending_exception("Error while calling createResolvedJavaType"); | 223 check_pending_exception("Error while calling createResolvedJavaType"); |
225 return (oop) result.get_jobject(); | 224 return (oop) result.get_jobject(); |
226 } | 225 } |