--- a/src/hotspot/share/opto/compile.cpp Thu Jan 31 13:36:31 2019 -0800
+++ b/src/hotspot/share/opto/compile.cpp Thu Jan 31 17:48:25 2019 -0800
@@ -648,6 +648,7 @@
_orig_pc_slot_offset_in_bytes(0),
_inlining_progress(false),
_inlining_incrementally(false),
+ _do_cleanup(false),
_has_reserved_stack_access(target->has_reserved_stack_access()),
#ifndef PRODUCT
_trace_opto_output(directive->TraceOptoOutputOption),
@@ -2051,52 +2052,49 @@
}
_boxing_late_inlines.trunc_to(0);
- {
- ResourceMark rm;
- PhaseRemoveUseless pru(gvn, for_igvn());
- }
-
- igvn = PhaseIterGVN(gvn);
- igvn.optimize();
-
- set_inlining_progress(false);
+ inline_incrementally_cleanup(igvn);
+
set_inlining_incrementally(false);
}
}
-void Compile::inline_incrementally_one(PhaseIterGVN& igvn) {
+bool Compile::inline_incrementally_one() {
assert(IncrementalInline, "incremental inlining should be on");
- PhaseGVN* gvn = initial_gvn();
+
+ TracePhase tp("incrementalInline_inline", &timers[_t_incrInline_inline]);
+ set_inlining_progress(false);
+ set_do_cleanup(false);
+ int i = 0;
+ for (; i <_late_inlines.length() && !inlining_progress(); i++) {
+ CallGenerator* cg = _late_inlines.at(i);
+ _late_inlines_pos = i+1;
+ cg->do_late_inline();
+ if (failing()) return false;
+ }
+ int j = 0;
+ for (; i < _late_inlines.length(); i++, j++) {
+ _late_inlines.at_put(j, _late_inlines.at(i));
+ }
+ _late_inlines.trunc_to(j);
+ assert(inlining_progress() || _late_inlines.length() == 0, "");
+
+ bool needs_cleanup = do_cleanup() || over_inlining_cutoff();
set_inlining_progress(false);
- for_igvn()->clear();
- gvn->replace_with(&igvn);
-
- {
- TracePhase tp("incrementalInline_inline", &timers[_t_incrInline_inline]);
- int i = 0;
- for (; i <_late_inlines.length() && !inlining_progress(); i++) {
- CallGenerator* cg = _late_inlines.at(i);
- _late_inlines_pos = i+1;
- cg->do_late_inline();
- if (failing()) return;
- }
- int j = 0;
- for (; i < _late_inlines.length(); i++, j++) {
- _late_inlines.at_put(j, _late_inlines.at(i));
- }
- _late_inlines.trunc_to(j);
- }
-
+ set_do_cleanup(false);
+ return (_late_inlines.length() > 0) && !needs_cleanup;
+}
+
+void Compile::inline_incrementally_cleanup(PhaseIterGVN& igvn) {
{
TracePhase tp("incrementalInline_pru", &timers[_t_incrInline_pru]);
ResourceMark rm;
- PhaseRemoveUseless pru(gvn, for_igvn());
+ PhaseRemoveUseless pru(initial_gvn(), for_igvn());
}
-
{
TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
- igvn = PhaseIterGVN(gvn);
+ igvn = PhaseIterGVN(initial_gvn());
+ igvn.optimize();
}
}
@@ -2104,14 +2102,10 @@
void Compile::inline_incrementally(PhaseIterGVN& igvn) {
TracePhase tp("incrementalInline", &timers[_t_incrInline]);
- PhaseGVN* gvn = initial_gvn();
-
set_inlining_incrementally(true);
- set_inlining_progress(true);
uint low_live_nodes = 0;
- while(inlining_progress() && _late_inlines.length() > 0) {
-
+ while (_late_inlines.length() > 0) {
if (live_nodes() > (uint)LiveNodeCountInliningCutoff) {
if (low_live_nodes < (uint)LiveNodeCountInliningCutoff * 8 / 10) {
TracePhase tp("incrementalInline_ideal", &timers[_t_incrInline_ideal]);
@@ -2125,22 +2119,23 @@
}
if (live_nodes() > (uint)LiveNodeCountInliningCutoff) {
- break;
+ break; // finish
}
}
- inline_incrementally_one(igvn);
-
- if (failing()) return;
-
- {
- TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
- igvn.optimize();
+ for_igvn()->clear();
+ initial_gvn()->replace_with(&igvn);
+
+ while (inline_incrementally_one()) {
+ assert(!failing(), "inconsistent");
}
if (failing()) return;
+
+ inline_incrementally_cleanup(igvn);
+
+ if (failing()) return;
}
-
assert( igvn._worklist.size() == 0, "should be done with igvn" );
if (_string_late_inlines.length() > 0) {
@@ -2152,17 +2147,7 @@
if (failing()) return;
- {
- TracePhase tp("incrementalInline_pru", &timers[_t_incrInline_pru]);
- ResourceMark rm;
- PhaseRemoveUseless pru(initial_gvn(), for_igvn());
- }
-
- {
- TracePhase tp("incrementalInline_igvn", &timers[_t_incrInline_igvn]);
- igvn = PhaseIterGVN(gvn);
- igvn.optimize();
- }
+ inline_incrementally_cleanup(igvn);
}
set_inlining_incrementally(false);