OpenJDK / graal / graal-jvmci-8
changeset 1786:f9883ee8ce39
6965815: OptimizeStringConcat: assert(!q->is_MergeMem()) failed with specjbb2000
Reviewed-by: kvn
author | never |
---|---|
date | Wed, 08 Sep 2010 20:28:57 -0700 |
parents | 5e4f03302987 |
children | 33a54060190d |
files | src/share/vm/opto/graphKit.cpp |
diffstat | 1 files changed, 16 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/opto/graphKit.cpp Tue Sep 07 11:31:27 2010 -0700 +++ b/src/share/vm/opto/graphKit.cpp Wed Sep 08 20:28:57 2010 -0700 @@ -1739,6 +1739,7 @@ C->gvn_replace_by(callprojs.fallthrough_catchproj, final_state->in(TypeFunc::Control)); C->gvn_replace_by(callprojs.fallthrough_memproj, final_state->in(TypeFunc::Memory)); C->gvn_replace_by(callprojs.fallthrough_ioproj, final_state->in(TypeFunc::I_O)); + Node* final_mem = final_state->in(TypeFunc::Memory); // Replace the result with the new result if it exists and is used if (callprojs.resproj != NULL && result != NULL) { @@ -1776,6 +1777,21 @@ // Disconnect the call from the graph call->disconnect_inputs(NULL); C->gvn_replace_by(call, C->top()); + + // 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()); + } + } }