Mercurial > hg > graal-compiler
comparison src/share/vm/runtime/compilationPolicy.cpp @ 10105:aeaca88565e6
8010862: The Method counter fields used for profiling can be allocated lazily.
Summary: Allocate the method's profiling related metadata until they are needed.
Reviewed-by: coleenp, roland
author | jiangli |
---|---|
date | Tue, 09 Apr 2013 17:17:41 -0400 |
parents | bd7a7ce2e264 |
children | 42a42da29fd7 |
comparison
equal
deleted
inserted
replaced
9055:dcdeb150988c | 10105:aeaca88565e6 |
---|---|
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. |
195 // Make sure invocation and backedge counter doesn't overflow again right away | 195 // Make sure invocation and backedge counter doesn't overflow again right away |
196 // as would be the case for native methods. | 196 // as would be the case for native methods. |
197 | 197 |
198 // BUT also make sure the method doesn't look like it was never executed. | 198 // BUT also make sure the method doesn't look like it was never executed. |
199 // Set carry bit and reduce counter's value to min(count, CompileThreshold/2). | 199 // Set carry bit and reduce counter's value to min(count, CompileThreshold/2). |
200 m->invocation_counter()->set_carry(); | 200 MethodCounters* mcs = m->method_counters(); |
201 m->backedge_counter()->set_carry(); | 201 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling"); |
202 mcs->invocation_counter()->set_carry(); | |
203 mcs->backedge_counter()->set_carry(); | |
202 | 204 |
203 assert(!m->was_never_executed(), "don't reset to 0 -- could be mistaken for never-executed"); | 205 assert(!m->was_never_executed(), "don't reset to 0 -- could be mistaken for never-executed"); |
204 } | 206 } |
205 | 207 |
206 void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) { | 208 void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) { |
207 // Delay next back-branch event but pump up invocation counter to triger | 209 // Delay next back-branch event but pump up invocation counter to triger |
208 // whole method compilation. | 210 // whole method compilation. |
209 InvocationCounter* i = m->invocation_counter(); | 211 MethodCounters* mcs = m->method_counters(); |
210 InvocationCounter* b = m->backedge_counter(); | 212 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling"); |
213 InvocationCounter* i = mcs->invocation_counter(); | |
214 InvocationCounter* b = mcs->backedge_counter(); | |
211 | 215 |
212 // Don't set invocation_counter's value too low otherwise the method will | 216 // Don't set invocation_counter's value too low otherwise the method will |
213 // look like immature (ic < ~5300) which prevents the inlining based on | 217 // look like immature (ic < ~5300) which prevents the inlining based on |
214 // the type profiling. | 218 // the type profiling. |
215 i->set(i->state(), CompileThreshold); | 219 i->set(i->state(), CompileThreshold); |
224 // is done at each safepoint. | 228 // is done at each safepoint. |
225 // | 229 // |
226 class CounterDecay : public AllStatic { | 230 class CounterDecay : public AllStatic { |
227 static jlong _last_timestamp; | 231 static jlong _last_timestamp; |
228 static void do_method(Method* m) { | 232 static void do_method(Method* m) { |
229 m->invocation_counter()->decay(); | 233 MethodCounters* mcs = m->method_counters(); |
234 if (mcs != NULL) { | |
235 mcs->invocation_counter()->decay(); | |
236 } | |
230 } | 237 } |
231 public: | 238 public: |
232 static void decay(); | 239 static void decay(); |
233 static bool is_decay_needed() { | 240 static bool is_decay_needed() { |
234 return (os::javaTimeMillis() - _last_timestamp) > CounterDecayMinIntervalLength; | 241 return (os::javaTimeMillis() - _last_timestamp) > CounterDecayMinIntervalLength; |
262 } | 269 } |
263 } | 270 } |
264 | 271 |
265 void NonTieredCompPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) { | 272 void NonTieredCompPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) { |
266 ScopeDesc* sd = trap_scope; | 273 ScopeDesc* sd = trap_scope; |
274 MethodCounters* mcs; | |
275 InvocationCounter* c; | |
267 for (; !sd->is_top(); sd = sd->sender()) { | 276 for (; !sd->is_top(); sd = sd->sender()) { |
268 // Reset ICs of inlined methods, since they can trigger compilations also. | 277 mcs = sd->method()->method_counters(); |
269 sd->method()->invocation_counter()->reset(); | 278 if (mcs != NULL) { |
270 } | 279 // Reset ICs of inlined methods, since they can trigger compilations also. |
271 InvocationCounter* c = sd->method()->invocation_counter(); | 280 mcs->invocation_counter()->reset(); |
272 if (is_osr) { | 281 } |
273 // It was an OSR method, so bump the count higher. | 282 } |
274 c->set(c->state(), CompileThreshold); | 283 mcs = sd->method()->method_counters(); |
275 } else { | 284 if (mcs != NULL) { |
276 c->reset(); | 285 c = mcs->invocation_counter(); |
277 } | 286 if (is_osr) { |
278 sd->method()->backedge_counter()->reset(); | 287 // It was an OSR method, so bump the count higher. |
288 c->set(c->state(), CompileThreshold); | |
289 } else { | |
290 c->reset(); | |
291 } | |
292 mcs->backedge_counter()->reset(); | |
293 } | |
279 } | 294 } |
280 | 295 |
281 // This method can be called by any component of the runtime to notify the policy | 296 // This method can be called by any component of the runtime to notify the policy |
282 // that it's recommended to delay the complation of this method. | 297 // that it's recommended to delay the complation of this method. |
283 void NonTieredCompPolicy::delay_compilation(Method* method) { | 298 void NonTieredCompPolicy::delay_compilation(Method* method) { |
284 method->invocation_counter()->decay(); | 299 MethodCounters* mcs = method->method_counters(); |
285 method->backedge_counter()->decay(); | 300 assert(mcs != NULL, "MethodCounters cannot be NULL"); |
301 mcs->invocation_counter()->decay(); | |
302 mcs->backedge_counter()->decay(); | |
286 } | 303 } |
287 | 304 |
288 void NonTieredCompPolicy::disable_compilation(Method* method) { | 305 void NonTieredCompPolicy::disable_compilation(Method* method) { |
289 method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing); | 306 MethodCounters* mcs = method->method_counters(); |
290 method->backedge_counter()->set_state(InvocationCounter::wait_for_nothing); | 307 if (mcs != NULL) { |
308 mcs->invocation_counter()->set_state(InvocationCounter::wait_for_nothing); | |
309 mcs->backedge_counter()->set_state(InvocationCounter::wait_for_nothing); | |
310 } | |
291 } | 311 } |
292 | 312 |
293 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) { | 313 CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) { |
294 return compile_queue->first(); | 314 return compile_queue->first(); |
295 } | 315 } |
368 } | 388 } |
369 | 389 |
370 #ifndef PRODUCT | 390 #ifndef PRODUCT |
371 void NonTieredCompPolicy::trace_frequency_counter_overflow(methodHandle m, int branch_bci, int bci) { | 391 void NonTieredCompPolicy::trace_frequency_counter_overflow(methodHandle m, int branch_bci, int bci) { |
372 if (TraceInvocationCounterOverflow) { | 392 if (TraceInvocationCounterOverflow) { |
373 InvocationCounter* ic = m->invocation_counter(); | 393 MethodCounters* mcs = m->method_counters(); |
374 InvocationCounter* bc = m->backedge_counter(); | 394 assert(mcs != NULL, "MethodCounters cannot be NULL for profiling"); |
395 InvocationCounter* ic = mcs->invocation_counter(); | |
396 InvocationCounter* bc = mcs->backedge_counter(); | |
375 ResourceMark rm; | 397 ResourceMark rm; |
376 const char* msg = | 398 const char* msg = |
377 bci == InvocationEntryBci | 399 bci == InvocationEntryBci |
378 ? "comp-policy cntr ovfl @ %d in entry of " | 400 ? "comp-policy cntr ovfl @ %d in entry of " |
379 : "comp-policy cntr ovfl @ %d in loop of "; | 401 : "comp-policy cntr ovfl @ %d in loop of "; |