aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/opto/graphKit.cpp
diff options
context:
space:
mode:
authornever <none@none>2010-09-08 20:28:57 -0700
committernever <none@none>2010-09-08 20:28:57 -0700
commit5f6c6f4ec748327554b6193b7bf1d30e6c5eb721 (patch)
treef1c42011301c6b77d714e96ea9d5d5394617d3ef /src/share/vm/opto/graphKit.cpp
parent60c12f363e88afb7f2ea6835f1abf6d4e7d545e8 (diff)
6965815: OptimizeStringConcat: assert(!q->is_MergeMem()) failed with specjbb2000
Reviewed-by: kvn
Diffstat (limited to 'src/share/vm/opto/graphKit.cpp')
-rw-r--r--src/share/vm/opto/graphKit.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/share/vm/opto/graphKit.cpp b/src/share/vm/opto/graphKit.cpp
index d34f82997..cbf43cb55 100644
--- a/src/share/vm/opto/graphKit.cpp
+++ b/src/share/vm/opto/graphKit.cpp
@@ -1739,6 +1739,7 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
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 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
// 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());
+ }
+ }
}