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)},