--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jan 08 12:05:19 2014 +0100
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jan 08 10:25:50 2014 -0800
@@ -50,7 +50,10 @@
_subtrees(c->comp_arena(), 2, 0, NULL),
_msg(NULL)
{
- NOT_PRODUCT(_count_inlines = 0;)
+#ifndef PRODUCT
+ _count_inlines = 0;
+ _forced_inline = false;
+#endif
if (_caller_jvms != NULL) {
// Keep a private copy of the caller_jvms:
_caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms());
@@ -81,7 +84,10 @@
_count_inline_bcs(method()->code_size()),
_msg(NULL)
{
- NOT_PRODUCT(_count_inlines = 0;)
+#ifndef PRODUCT
+ _count_inlines = 0;
+ _forced_inline = false;
+#endif
assert(!UseOldInlining, "do not use for old stuff");
}
@@ -128,9 +134,19 @@
tty->print_cr("Inlined method is hot: ");
}
set_msg("force inline by CompilerOracle");
+ _forced_inline = true;
return true;
}
+#ifndef PRODUCT
+ int inline_depth = inline_level()+1;
+ if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) {
+ set_msg("force inline by ciReplay");
+ _forced_inline = true;
+ return true;
+ }
+#endif
+
int size = callee_method->code_size_for_inlining();
// Check for too many throws (and not too huge)
@@ -264,6 +280,18 @@
}
#ifndef PRODUCT
+ int caller_bci = jvms->bci();
+ int inline_depth = inline_level()+1;
+ if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) {
+ set_msg("force inline by ciReplay");
+ return false;
+ }
+
+ if (ciReplay::should_not_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) {
+ set_msg("disallowed by ciReplay");
+ return true;
+ }
+
if (ciReplay::should_not_inline(callee_method)) {
set_msg("disallowed by ciReplay");
return true;
@@ -343,6 +371,7 @@
}
}
+ _forced_inline = false; // Reset
if (!should_inline(callee_method, caller_method, caller_bci, profile,
wci_result)) {
return false;
@@ -373,10 +402,10 @@
if ((!UseInterpreter || CompileTheWorld) &&
is_init_with_ea(callee_method, caller_method, C)) {
-
// Escape Analysis stress testing when running Xcomp or CTW:
// inline constructors even if they are not reached.
-
+ } else if (forced_inline()) {
+ // Inlining was forced by CompilerOracle or ciReplay
} else if (profile.count() == 0) {
// don't inline unreached call sites
set_msg("call site not reached");
@@ -700,12 +729,28 @@
return iltp;
}
+// Count number of nodes in this subtree
+int InlineTree::count() const {
+ int result = 1;
+ for (int i = 0 ; i < _subtrees.length(); i++) {
+ result += _subtrees.at(i)->count();
+ }
+ return result;
+}
+
+void InlineTree::dump_replay_data(outputStream* out) {
+ out->print(" %d %d ", inline_level(), caller_bci());
+ method()->dump_name_as_ascii(out);
+ for (int i = 0 ; i < _subtrees.length(); i++) {
+ _subtrees.at(i)->dump_replay_data(out);
+ }
+}
#ifndef PRODUCT
void InlineTree::print_impl(outputStream* st, int indent) const {
for (int i = 0; i < indent; i++) st->print(" ");
- st->print(" @ %d ", caller_bci());
+ st->print(" @ %d", caller_bci());
method()->print_short_name(st);
st->cr();