OpenJDK / jdk / jdk
changeset 55004:4645b6d57f54
8223581: C2 compilation failed with assert(!q->is_MergeMem())
Summary: Aggressively remove MergeMems feeding into other MergeMems during incremental inlining.
Reviewed-by: vlivanov
author | thartmann |
---|---|
date | Thu, 23 May 2019 09:46:49 +0200 |
parents | bec1bb783c7e |
children | 9b70ebd131b4 |
files | src/hotspot/share/opto/graphKit.cpp |
diffstat | 1 files changed, 19 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/opto/graphKit.cpp Thu May 23 08:57:37 2019 +0200 +++ b/src/hotspot/share/opto/graphKit.cpp Thu May 23 09:46:49 2019 +0200 @@ -1859,6 +1859,18 @@ } } +// Keep track of MergeMems feeding into other MergeMems +static void add_mergemem_users_to_worklist(Unique_Node_List& wl, Node* mem) { + if (!mem->is_MergeMem()) { + return; + } + for (SimpleDUIterator i(mem); i.has_next(); i.next()) { + Node* use = i.get(); + if (use->is_MergeMem()) { + wl.push(use); + } + } +} // Replace the call with the current state of the kit. void GraphKit::replace_call(CallNode* call, Node* result, bool do_replaced_nodes) { @@ -1877,6 +1889,7 @@ CallProjections callprojs; call->extract_projections(&callprojs, true); + Unique_Node_List wl; Node* init_mem = call->in(TypeFunc::Memory); Node* final_mem = final_state->in(TypeFunc::Memory); Node* final_ctl = final_state->in(TypeFunc::Control); @@ -1892,6 +1905,7 @@ final_mem = _gvn.transform(final_mem); } C->gvn_replace_by(callprojs.fallthrough_memproj, final_mem); + add_mergemem_users_to_worklist(wl, final_mem); } if (callprojs.fallthrough_ioproj != NULL) { C->gvn_replace_by(callprojs.fallthrough_ioproj, final_io); @@ -1931,7 +1945,9 @@ ex_ctl = ekit.control(); } if (callprojs.catchall_memproj != NULL) { - C->gvn_replace_by(callprojs.catchall_memproj, ekit.reset_memory()); + Node* ex_mem = ekit.reset_memory(); + C->gvn_replace_by(callprojs.catchall_memproj, ex_mem); + add_mergemem_users_to_worklist(wl, ex_mem); } if (callprojs.catchall_ioproj != NULL) { C->gvn_replace_by(callprojs.catchall_ioproj, ekit.i_o()); @@ -1949,17 +1965,8 @@ // Clean up any MergeMems that feed other MergeMems since the // optimizer doesn't like that. - if (final_mem->is_MergeMem()) { - Node_List wl; - for (SimpleDUIterator i(final_mem); i.has_next(); i.next()) { - Node* m = i.get(); - if (m->is_MergeMem() && !wl.contains(m)) { - wl.push(m); - } - } - while (wl.size() > 0) { - _gvn.transform(wl.pop()); - } + while (wl.size() > 0) { + _gvn.transform(wl.pop()); } if (callprojs.fallthrough_catchproj != NULL && !final_ctl->is_top() && do_replaced_nodes) {