comparison src/share/vm/runtime/compilationPolicy.cpp @ 10107:8df6ddda8090

Merge
author jiangli
date Mon, 15 Apr 2013 21:25:23 -0400
parents b84fd7d73702 42a42da29fd7
children d1c9384eecb4
comparison
equal deleted inserted replaced
9149:c60f69931e1a 10107:8df6ddda8090
1 /* 1 /*
2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
196 // Make sure invocation and backedge counter doesn't overflow again right away 196 // Make sure invocation and backedge counter doesn't overflow again right away
197 // as would be the case for native methods. 197 // as would be the case for native methods.
198 198
199 // BUT also make sure the method doesn't look like it was never executed. 199 // BUT also make sure the method doesn't look like it was never executed.
200 // Set carry bit and reduce counter's value to min(count, CompileThreshold/2). 200 // Set carry bit and reduce counter's value to min(count, CompileThreshold/2).
201 m->invocation_counter()->set_carry(); 201 MethodCounters* mcs = m->method_counters();
202 m->backedge_counter()->set_carry(); 202 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling");
203 mcs->invocation_counter()->set_carry();
204 mcs->backedge_counter()->set_carry();
203 205
204 assert(!m->was_never_executed(), "don't reset to 0 -- could be mistaken for never-executed"); 206 assert(!m->was_never_executed(), "don't reset to 0 -- could be mistaken for never-executed");
205 } 207 }
206 208
207 void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) { 209 void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) {
208 // Delay next back-branch event but pump up invocation counter to triger 210 // Delay next back-branch event but pump up invocation counter to triger
209 // whole method compilation. 211 // whole method compilation.
210 InvocationCounter* i = m->invocation_counter(); 212 MethodCounters* mcs = m->method_counters();
211 InvocationCounter* b = m->backedge_counter(); 213 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling");
214 InvocationCounter* i = mcs->invocation_counter();
215 InvocationCounter* b = mcs->backedge_counter();
212 216
213 // Don't set invocation_counter's value too low otherwise the method will 217 // Don't set invocation_counter's value too low otherwise the method will
214 // look like immature (ic < ~5300) which prevents the inlining based on 218 // look like immature (ic < ~5300) which prevents the inlining based on
215 // the type profiling. 219 // the type profiling.
216 i->set(i->state(), CompileThreshold); 220 i->set(i->state(), CompileThreshold);
225 // is done at each safepoint. 229 // is done at each safepoint.
226 // 230 //
227 class CounterDecay : public AllStatic { 231 class CounterDecay : public AllStatic {
228 static jlong _last_timestamp; 232 static jlong _last_timestamp;
229 static void do_method(Method* m) { 233 static void do_method(Method* m) {
230 m->invocation_counter()->decay(); 234 MethodCounters* mcs = m->method_counters();
235 if (mcs != NULL) {
236 mcs->invocation_counter()->decay();
237 }
231 } 238 }
232 public: 239 public:
233 static void decay(); 240 static void decay();
234 static bool is_decay_needed() { 241 static bool is_decay_needed() {
235 return (os::javaTimeMillis() - _last_timestamp) > CounterDecayMinIntervalLength; 242 return (os::javaTimeMillis() - _last_timestamp) > CounterDecayMinIntervalLength;
263 } 270 }
264 } 271 }
265 272
266 void NonTieredCompPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) { 273 void NonTieredCompPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) {
267 ScopeDesc* sd = trap_scope; 274 ScopeDesc* sd = trap_scope;
275 MethodCounters* mcs;
276 InvocationCounter* c;
268 for (; !sd->is_top(); sd = sd->sender()) { 277 for (; !sd->is_top(); sd = sd->sender()) {
269 // Reset ICs of inlined methods, since they can trigger compilations also. 278 mcs = sd->method()->method_counters();
270 sd->method()->invocation_counter()->reset(); 279 if (mcs != NULL) {
271 } 280 // Reset ICs of inlined methods, since they can trigger compilations also.
272 InvocationCounter* c = sd->method()->invocation_counter(); 281 mcs->invocation_counter()->reset();
273 if (is_osr) { 282 }
274 // It was an OSR method, so bump the count higher. 283 }
275 c->set(c->state(), CompileThreshold); 284 mcs = sd->method()->method_counters();
276 } else { 285 if (mcs != NULL) {
277 c->reset(); 286 c = mcs->invocation_counter();
278 } 287 if (is_osr) {
279 sd->method()->backedge_counter()->reset(); 288 // It was an OSR method, so bump the count higher.
289 c->set(c->state(), CompileThreshold);
290 } else {
291 c->reset();
292 }
293 mcs->backedge_counter()->reset();
294 }
280 } 295 }
281 296
282 // This method can be called by any component of the runtime to notify the policy 297 // This method can be called by any component of the runtime to notify the policy
283 // that it's recommended to delay the complation of this method. 298 // that it's recommended to delay the complation of this method.
284 void NonTieredCompPolicy::delay_compilation(Method* method) { 299 void NonTieredCompPolicy::delay_compilation(Method* method) {
285 method->invocation_counter()->decay(); 300 MethodCounters* mcs = method->method_counters();
286 method->backedge_counter()->decay(); 301 if (mcs != NULL) {
302 mcs->invocation_counter()->decay();
303 mcs->backedge_counter()->decay();
304 }
287 } 305 }
288 306
289 void NonTieredCompPolicy::disable_compilation(Method* method) { 307 void NonTieredCompPolicy::disable_compilation(Method* method) {
290 method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing); 308 MethodCounters* mcs = method->method_counters();
291 method->backedge_counter()->set_state(InvocationCounter::wait_for_nothing); 309 if (mcs != NULL) {
310 mcs->invocation_counter()->set_state(InvocationCounter::wait_for_nothing);
311 mcs->backedge_counter()->set_state(InvocationCounter::wait_for_nothing);
312 }
292 } 313 }
293 314
294 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) { 315 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) {
295 return compile_queue->first(); 316 return compile_queue->first();
296 } 317 }
369 } 390 }
370 391
371 #ifndef PRODUCT 392 #ifndef PRODUCT
372 void NonTieredCompPolicy::trace_frequency_counter_overflow(methodHandle m, int branch_bci, int bci) { 393 void NonTieredCompPolicy::trace_frequency_counter_overflow(methodHandle m, int branch_bci, int bci) {
373 if (TraceInvocationCounterOverflow) { 394 if (TraceInvocationCounterOverflow) {
374 InvocationCounter* ic = m->invocation_counter(); 395 MethodCounters* mcs = m->method_counters();
375 InvocationCounter* bc = m->backedge_counter(); 396 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling");
397 InvocationCounter* ic = mcs->invocation_counter();
398 InvocationCounter* bc = mcs->backedge_counter();
376 ResourceMark rm; 399 ResourceMark rm;
377 const char* msg = 400 const char* msg =
378 bci == InvocationEntryBci 401 bci == InvocationEntryBci
379 ? "comp-policy cntr ovfl @ %d in entry of " 402 ? "comp-policy cntr ovfl @ %d in entry of "
380 : "comp-policy cntr ovfl @ %d in loop of "; 403 : "comp-policy cntr ovfl @ %d in loop of ";