diff -r cc624b341ab2 -r 970dc585ab63 hotspot/src/share/vm/oops/methodOop.hpp --- a/hotspot/src/share/vm/oops/methodOop.hpp Thu Sep 02 11:40:02 2010 -0700 +++ b/hotspot/src/share/vm/oops/methodOop.hpp Fri Sep 03 17:51:07 2010 -0700 @@ -62,9 +62,9 @@ // | method_size | max_stack | // | max_locals | size_of_parameters | // |------------------------------------------------------| -// | intrinsic_id, highest_tier | (unused) | +// | intrinsic_id, (unused) | throwout_count | // |------------------------------------------------------| -// | throwout_count | num_breakpoints | +// | num_breakpoints | (unused) | // |------------------------------------------------------| // | invocation_counter | // | backedge_counter | @@ -83,7 +83,6 @@ class CheckedExceptionElement; class LocalVariableTableElement; class AdapterHandlerEntry; - class methodDataOopDesc; class methodOopDesc : public oopDesc { @@ -93,7 +92,7 @@ constMethodOop _constMethod; // Method read-only data. constantPoolOop _constants; // Constant pool methodDataOop _method_data; - int _interpreter_invocation_count; // Count of times invoked + int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered) AccessFlags _access_flags; // Access flags int _vtable_index; // vtable index of this method (see VtableIndexFlag) // note: can have vtables with >2**16 elements (because of inheritance) @@ -105,11 +104,11 @@ u2 _max_locals; // Number of local variables used by this method u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none) - u1 _highest_tier_compile; // Highest compile level this method has ever seen. u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting u2 _number_of_breakpoints; // fullspeed debugging support InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations + #ifndef PRODUCT int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging) #endif @@ -221,8 +220,11 @@ // max locals int max_locals() const { return _max_locals; } void set_max_locals(int size) { _max_locals = size; } - int highest_tier_compile() { return _highest_tier_compile;} - void set_highest_tier_compile(int level) { _highest_tier_compile = level;} + + int highest_comp_level() const; + void set_highest_comp_level(int level); + int highest_osr_comp_level() const; + void set_highest_osr_comp_level(int level); // Count of times method was exited via exception while interpreting void interpreter_throwout_increment() { @@ -276,21 +278,29 @@ } // invocation counter - InvocationCounter* invocation_counter() { return &_invocation_counter; } - InvocationCounter* backedge_counter() { return &_backedge_counter; } - int invocation_count() const { return _invocation_counter.count(); } - int backedge_count() const { return _backedge_counter.count(); } - bool was_executed_more_than(int n) const; - bool was_never_executed() const { return !was_executed_more_than(0); } + InvocationCounter* invocation_counter() { return &_invocation_counter; } + InvocationCounter* backedge_counter() { return &_backedge_counter; } + + int invocation_count(); + int backedge_count(); + + bool was_executed_more_than(int n); + bool was_never_executed() { return !was_executed_more_than(0); } static void build_interpreter_method_data(methodHandle method, TRAPS); - int interpreter_invocation_count() const { return _interpreter_invocation_count; } + int interpreter_invocation_count() { + if (TieredCompilation) return invocation_count(); + else return _interpreter_invocation_count; + } void set_interpreter_invocation_count(int count) { _interpreter_invocation_count = count; } - int increment_interpreter_invocation_count() { return ++_interpreter_invocation_count; } + int increment_interpreter_invocation_count() { + if (TieredCompilation) ShouldNotReachHere(); + return ++_interpreter_invocation_count; + } #ifndef PRODUCT - int compiled_invocation_count() const { return _compiled_invocation_count; } + int compiled_invocation_count() const { return _compiled_invocation_count; } void set_compiled_invocation_count(int count) { _compiled_invocation_count = count; } #endif // not PRODUCT @@ -361,7 +371,7 @@ #ifndef PRODUCT // operations on invocation counter - void print_invocation_count() const; + void print_invocation_count(); #endif // byte codes @@ -587,8 +597,13 @@ static vmSymbols::SID klass_id_for_intrinsics(klassOop holder); // On-stack replacement support - bool has_osr_nmethod() { return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci) != NULL; } - nmethod* lookup_osr_nmethod_for(int bci) { return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, bci); } + bool has_osr_nmethod(int level, bool match_level) { + return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL; + } + + nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) { + return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, bci, level, match_level); + } // Inline cache support void cleanup_inline_caches(); @@ -600,22 +615,24 @@ // Indicates whether compilation failed earlier for this method, or // whether it is not compilable for another reason like having a // breakpoint set in it. - bool is_not_compilable(int comp_level = CompLevel_highest_tier) const; - void set_not_compilable(int comp_level = CompLevel_highest_tier, bool report = true); - void set_not_compilable_quietly(int comp_level = CompLevel_highest_tier) { + bool is_not_compilable(int comp_level = CompLevel_any) const; + void set_not_compilable(int comp_level = CompLevel_all, bool report = true); + void set_not_compilable_quietly(int comp_level = CompLevel_all) { set_not_compilable(comp_level, false); } - - bool is_not_osr_compilable() const { return is_not_compilable() || access_flags().is_not_osr_compilable(); } - void set_not_osr_compilable() { _access_flags.set_not_osr_compilable(); } - - bool is_not_tier1_compilable() const { return access_flags().is_not_tier1_compilable(); } - void set_not_tier1_compilable() { _access_flags.set_not_tier1_compilable(); } + bool is_not_osr_compilable(int comp_level = CompLevel_any) const { + return is_not_compilable(comp_level) || access_flags().is_not_osr_compilable(); + } + void set_not_osr_compilable() { _access_flags.set_not_osr_compilable(); } + bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); } + void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); } + bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); } + void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); } // Background compilation support - bool queued_for_compilation() const { return access_flags().queued_for_compilation(); } - void set_queued_for_compilation() { _access_flags.set_queued_for_compilation(); } - void clear_queued_for_compilation() { _access_flags.clear_queued_for_compilation(); } + bool queued_for_compilation() const { return access_flags().queued_for_compilation(); } + void set_queued_for_compilation() { _access_flags.set_queued_for_compilation(); } + void clear_queued_for_compilation() { _access_flags.clear_queued_for_compilation(); } static methodOop method_from_bcp(address bcp);