changeset 1687:243e95e6a37d

6965815: OptimizeStringConcat: assert(!q->is_MergeMem()) failed with specjbb2000 Reviewed-by: kvn
author never
date Wed, 08 Sep 2010 20:28:57 -0700
parents 53adfc40121e
children c53baab9d988
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	Fri Oct 01 09:19:30 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());
+    }
+  }
 }