Mercurial > hg > truffle
comparison src/share/vm/graal/graalVMEntries.cpp @ 2927:f9c6d9bc4fbc
RiMethod provides branch prediction information
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 09 Jun 2011 17:33:08 +0200 |
parents | 0e3ec0a4eda4 |
children | 66ecfc755c86 |
comparison
equal
deleted
inserted
replaced
2926:0e3ec0a4eda4 | 2927:f9c6d9bc4fbc |
---|---|
28 #include "graal/graalCodeInstaller.hpp" | 28 #include "graal/graalCodeInstaller.hpp" |
29 #include "graal/graalVMExits.hpp" | 29 #include "graal/graalVMExits.hpp" |
30 #include "graal/graalVmIds.hpp" | 30 #include "graal/graalVmIds.hpp" |
31 #include "c1/c1_Runtime1.hpp" | 31 #include "c1/c1_Runtime1.hpp" |
32 #include "memory/oopFactory.hpp" | 32 #include "memory/oopFactory.hpp" |
33 #include "ci/ciMethodData.hpp" | |
33 | 34 |
34 // public byte[] RiMethod_code(long vmId); | 35 // public byte[] RiMethod_code(long vmId); |
35 JNIEXPORT jbyteArray JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1code(JNIEnv *env, jobject, jlong vmId) { | 36 JNIEXPORT jbyteArray JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1code(JNIEnv *env, jobject, jlong vmId) { |
36 TRACE_graal_3("VMEntries::RiMethod_code"); | 37 TRACE_graal_3("VMEntries::RiMethod_code"); |
37 methodHandle method = VmIds::get<methodOop>(vmId); | 38 methodHandle method = VmIds::get<methodOop>(vmId); |
156 Handle name = VmIds::toString<Handle>(unique_concrete->name(), CHECK_NULL); | 157 Handle name = VmIds::toString<Handle>(unique_concrete->name(), CHECK_NULL); |
157 oop method_resolved = VMExits::createRiMethodResolved(VmIds::add<methodOop>(unique_concrete()), name, CHECK_NULL); | 158 oop method_resolved = VMExits::createRiMethodResolved(VmIds::add<methodOop>(unique_concrete()), name, CHECK_NULL); |
158 return JNIHandles::make_local(THREAD, method_resolved); | 159 return JNIHandles::make_local(THREAD, method_resolved); |
159 } | 160 } |
160 | 161 |
161 // public native int RiMethod_invocationCount(); | 162 // public native int RiMethod_invocationCount(long vmId); |
162 JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount(JNIEnv *, jobject, jlong vmId) { | 163 JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount(JNIEnv *, jobject, jlong vmId) { |
163 TRACE_graal_3("VMEntries::RiMethod_invocationCount"); | 164 TRACE_graal_3("VMEntries::RiMethod_invocationCount"); |
164 return VmIds::get<methodOop>(vmId)->invocation_count(); | 165 return VmIds::get<methodOop>(vmId)->invocation_count(); |
165 } | 166 } |
166 | 167 |
167 // public native RiTypeProfile RiMethod_typeProfile(int bci); | 168 // public native RiTypeProfile RiMethod_typeProfile(long vmId, int bci); |
168 JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile(JNIEnv *, jobject, jlong vmId, jint bci) { | 169 JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile(JNIEnv *, jobject, jlong vmId, jint bci) { |
169 TRACE_graal_3("VMEntries::RiMethod_typeProfile"); | 170 TRACE_graal_3("VMEntries::RiMethod_typeProfile"); |
170 ciMethod* cimethod; | 171 ciMethod* cimethod; |
171 { | 172 { |
172 VM_ENTRY_MARK; | 173 VM_ENTRY_MARK; |
188 RiTypeProfile::set_probabilities(obj, NULL); | 189 RiTypeProfile::set_probabilities(obj, NULL); |
189 RiTypeProfile::set_types(obj, NULL); | 190 RiTypeProfile::set_types(obj, NULL); |
190 } | 191 } |
191 | 192 |
192 return JNIHandles::make_local(obj()); | 193 return JNIHandles::make_local(obj()); |
194 } | |
195 | |
196 // public native RiTypeProfile RiMethod_branchProfile(long vmId, int bci); | |
197 JNIEXPORT jint JNICALL Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability(JNIEnv *, jobject, jlong vmId, jint bci) { | |
198 TRACE_graal_3("VMEntries::RiMethod_typeProfile"); | |
199 ciMethodData* method_data; | |
200 ciMethod* cimethod; | |
201 { | |
202 VM_ENTRY_MARK; | |
203 cimethod = (ciMethod*)CURRENT_ENV->get_object(VmIds::get<methodOop>(vmId)); | |
204 } | |
205 method_data = cimethod->method_data(); | |
206 | |
207 jfloat probability = -1; | |
208 | |
209 if (!method_data->is_mature()) return -1; | |
210 | |
211 ciProfileData* data = method_data->bci_to_data(bci); | |
212 if (!data->is_JumpData()) return -1; | |
213 | |
214 // get taken and not taken values | |
215 int taken = data->as_JumpData()->taken(); | |
216 int not_taken = 0; | |
217 if (data->is_BranchData()) { | |
218 not_taken = data->as_BranchData()->not_taken(); | |
219 } | |
220 | |
221 // scale the counts to be commensurate with invocation counts: | |
222 taken = cimethod->scale_count(taken); | |
223 not_taken = cimethod->scale_count(not_taken); | |
224 | |
225 // Give up if too few (or too many, in which case the sum will overflow) counts to be meaningful. | |
226 // We also check that individual counters are positive first, otherwise the sum can become positive. | |
227 if (taken < 0 || not_taken < 0 || taken + not_taken < 40) return -1; | |
228 | |
229 // Pin probability to sane limits | |
230 if (taken == 0) | |
231 return 0; | |
232 else if (not_taken == 0) | |
233 return 100; | |
234 else { // Compute probability of true path | |
235 int probability = (int)(taken * 100.0 / (taken + not_taken)); | |
236 return MIN2(99, MAX2(1, probability)); | |
237 } | |
193 } | 238 } |
194 | 239 |
195 // public RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass); | 240 // public RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass); |
196 JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType(JNIEnv *env, jobject, jstring jname, jobject accessingClass) { | 241 JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType(JNIEnv *env, jobject, jstring jname, jobject accessingClass) { |
197 TRACE_graal_3("VMEntries::RiSignature_lookupType"); | 242 TRACE_graal_3("VMEntries::RiSignature_lookupType"); |
721 {CC"RiMethod_exceptionHandlers", CC"("PROXY")"EXCEPTION_HANDLERS, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1exceptionHandlers)}, | 766 {CC"RiMethod_exceptionHandlers", CC"("PROXY")"EXCEPTION_HANDLERS, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1exceptionHandlers)}, |
722 {CC"RiMethod_hasBalancedMonitors", CC"("PROXY")Z", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1hasBalancedMonitors)}, | 767 {CC"RiMethod_hasBalancedMonitors", CC"("PROXY")Z", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1hasBalancedMonitors)}, |
723 {CC"RiMethod_uniqueConcreteMethod", CC"("PROXY")"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1uniqueConcreteMethod)}, | 768 {CC"RiMethod_uniqueConcreteMethod", CC"("PROXY")"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1uniqueConcreteMethod)}, |
724 {CC"RiMethod_invocationCount", CC"("PROXY")I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount)}, | 769 {CC"RiMethod_invocationCount", CC"("PROXY")I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1invocationCount)}, |
725 {CC"RiMethod_typeProfile", CC"("PROXY"I)"TYPE_PROFILE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile)}, | 770 {CC"RiMethod_typeProfile", CC"("PROXY"I)"TYPE_PROFILE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1typeProfile)}, |
771 {CC"RiMethod_branchProbability", CC"("PROXY"I)I", FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiMethod_1branchProbability)}, | |
726 {CC"RiSignature_lookupType", CC"("STRING RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType)}, | 772 {CC"RiSignature_lookupType", CC"("STRING RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiSignature_1lookupType)}, |
727 {CC"RiConstantPool_lookupConstant", CC"("PROXY"I)"OBJECT, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupConstant)}, | 773 {CC"RiConstantPool_lookupConstant", CC"("PROXY"I)"OBJECT, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupConstant)}, |
728 {CC"RiConstantPool_lookupMethod", CC"("PROXY"IB)"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupMethod)}, | 774 {CC"RiConstantPool_lookupMethod", CC"("PROXY"IB)"METHOD, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupMethod)}, |
729 {CC"RiConstantPool_lookupSignature", CC"("PROXY"I)"SIGNATURE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupSignature)}, | 775 {CC"RiConstantPool_lookupSignature", CC"("PROXY"I)"SIGNATURE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupSignature)}, |
730 {CC"RiConstantPool_lookupType", CC"("PROXY"I)"TYPE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupType)}, | 776 {CC"RiConstantPool_lookupType", CC"("PROXY"I)"TYPE, FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiConstantPool_1lookupType)}, |