8006613: adding reason to made_not_compilable
Reviewed-by: kvn, vlivanov
diff --git a/hotspot/src/share/vm/ci/ciMethod.cpp b/hotspot/src/share/vm/ci/ciMethod.cpp
index 11df2b1..85f6afb 100644
--- a/hotspot/src/share/vm/ci/ciMethod.cpp
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp
@@ -970,7 +970,7 @@
// ciMethod::set_not_compilable
//
// Tell the VM that this method cannot be compiled at all.
-void ciMethod::set_not_compilable() {
+void ciMethod::set_not_compilable(const char* reason) {
check_is_loaded();
VM_ENTRY_MARK;
ciEnv* env = CURRENT_ENV;
@@ -979,7 +979,7 @@
} else {
_is_c2_compilable = false;
}
- get_methodOop()->set_not_compilable(env->comp_level());
+ get_methodOop()->set_not_compilable(env->comp_level(), true, reason);
}
// ------------------------------------------------------------------
diff --git a/hotspot/src/share/vm/ci/ciMethod.hpp b/hotspot/src/share/vm/ci/ciMethod.hpp
index 0f25fc6..8307ff9 100644
--- a/hotspot/src/share/vm/ci/ciMethod.hpp
+++ b/hotspot/src/share/vm/ci/ciMethod.hpp
@@ -250,7 +250,7 @@
bool has_option(const char *option);
bool can_be_compiled();
bool can_be_osr_compiled(int entry_bci);
- void set_not_compilable();
+ void set_not_compilable(const char* reason = NULL);
bool has_compiled_code();
int instructions_size(int comp_level = CompLevel_any);
void log_nmethod_identity(xmlStream* log);
diff --git a/hotspot/src/share/vm/compiler/compileBroker.cpp b/hotspot/src/share/vm/compiler/compileBroker.cpp
index d6336b9..0feca89 100644
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp
@@ -1376,7 +1376,7 @@
method->print_short_name(tty);
tty->cr();
}
- method->set_not_compilable_quietly();
+ method->set_not_compilable(CompLevel_all, !quietly, "excluded by CompilerOracle");
}
return false;
diff --git a/hotspot/src/share/vm/oops/methodDataOop.hpp b/hotspot/src/share/vm/oops/methodDataOop.hpp
index 350590a..419f04e 100644
--- a/hotspot/src/share/vm/oops/methodDataOop.hpp
+++ b/hotspot/src/share/vm/oops/methodDataOop.hpp
@@ -1502,7 +1502,7 @@
void inc_decompile_count() {
_nof_decompiles += 1;
if (decompile_count() > (uint)PerMethodRecompilationCutoff) {
- method()->set_not_compilable(CompLevel_full_optimization);
+ method()->set_not_compilable(CompLevel_full_optimization, true, "decompile_count > PerMethodRecompilationCutoff");
}
}
diff --git a/hotspot/src/share/vm/oops/methodOop.cpp b/hotspot/src/share/vm/oops/methodOop.cpp
index 8d19eef..7b599c9 100644
--- a/hotspot/src/share/vm/oops/methodOop.cpp
+++ b/hotspot/src/share/vm/oops/methodOop.cpp
@@ -613,7 +613,7 @@
}
-void methodOopDesc::print_made_not_compilable(int comp_level, bool is_osr, bool report) {
+void methodOopDesc::print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason) {
if (PrintCompilation && report) {
ttyLocker ttyl;
tty->print("made not %scompilable on ", is_osr ? "OSR " : "");
@@ -627,14 +627,21 @@
}
this->print_short_name(tty);
int size = this->code_size();
- if (size > 0)
+ if (size > 0) {
tty->print(" (%d bytes)", size);
+ }
+ if (reason != NULL) {
+ tty->print(" %s", reason);
+ }
tty->cr();
}
if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) {
ttyLocker ttyl;
xtty->begin_elem("make_not_%scompilable thread='" UINTX_FORMAT "'",
is_osr ? "osr_" : "", os::current_thread_id());
+ if (reason != NULL) {
+ xtty->print(" reason=\'%s\'", reason);
+ }
xtty->method(methodOop(this));
xtty->stamp();
xtty->end_elem();
@@ -656,8 +663,8 @@
}
// call this when compiler finds that this method is not compilable
-void methodOopDesc::set_not_compilable(int comp_level, bool report) {
- print_made_not_compilable(comp_level, /*is_osr*/ false, report);
+void methodOopDesc::set_not_compilable(int comp_level, bool report, const char* reason) {
+ print_made_not_compilable(comp_level, /*is_osr*/ false, report, reason);
if (comp_level == CompLevel_all) {
set_not_c1_compilable();
set_not_c2_compilable();
@@ -682,8 +689,8 @@
return false;
}
-void methodOopDesc::set_not_osr_compilable(int comp_level, bool report) {
- print_made_not_compilable(comp_level, /*is_osr*/ true, report);
+void methodOopDesc::set_not_osr_compilable(int comp_level, bool report, const char* reason) {
+ print_made_not_compilable(comp_level, /*is_osr*/ true, report, reason);
if (comp_level == CompLevel_all) {
set_not_c1_osr_compilable();
set_not_c2_osr_compilable();
diff --git a/hotspot/src/share/vm/oops/methodOop.hpp b/hotspot/src/share/vm/oops/methodOop.hpp
index 55f8e84..486e106 100644
--- a/hotspot/src/share/vm/oops/methodOop.hpp
+++ b/hotspot/src/share/vm/oops/methodOop.hpp
@@ -678,18 +678,18 @@
// whether it is not compilable for another reason like having a
// breakpoint set in it.
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(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
void set_not_compilable_quietly(int comp_level = CompLevel_all) {
set_not_compilable(comp_level, false);
}
bool is_not_osr_compilable(int comp_level = CompLevel_any) const;
- void set_not_osr_compilable(int comp_level = CompLevel_all, bool report = true);
+ void set_not_osr_compilable(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
void set_not_osr_compilable_quietly(int comp_level = CompLevel_all) {
set_not_osr_compilable(comp_level, false);
}
private:
- void print_made_not_compilable(int comp_level, bool is_osr, bool report);
+ void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
public:
bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp
index 4149639..e15181f 100644
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp
@@ -1559,7 +1559,7 @@
if (trap_method() == nm->method()) {
make_not_compilable = true;
} else {
- trap_method->set_not_compilable(CompLevel_full_optimization);
+ trap_method->set_not_compilable(CompLevel_full_optimization, true, "overflow_recompile_count > PerBytecodeRecompilationCutoff");
// But give grace to the enclosing nm->method().
}
}