Merge
authortwisti
Thu, 09 Sep 2010 01:43:48 -0700
changeset 6458 93b1fc88337d
parent 6457 1d39f3e9005e (current diff)
parent 6456 7e5f1fcd6519 (diff)
child 6459 3d75ed40a975
Merge
--- a/hotspot/src/share/vm/opto/graphKit.cpp	Wed Sep 08 04:50:26 2010 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp	Thu Sep 09 01:43:48 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());
+    }
+  }
 }
 
 
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Sep 08 04:50:26 2010 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Thu Sep 09 01:43:48 2010 -0700
@@ -2417,6 +2417,8 @@
       Node* value = n->in(MemNode::ValueIn);
       if (!lpt->is_invariant(value)) {
         msg  = "variant store value";
+      } else if (!_igvn.type(n->in(MemNode::Address))->isa_aryptr()) {
+        msg = "not array address";
       }
       store = n;
       store_value = value;
@@ -2468,6 +2470,7 @@
   // head->phi * elsize + con.  head->phi might have a ConvI2L.
   Node* elements[4];
   Node* conv = NULL;
+  bool found_index = false;
   int count = store->in(MemNode::Address)->as_AddP()->unpack_offsets(elements, ARRAY_SIZE(elements));
   for (int e = 0; e < count; e++) {
     Node* n = elements[e];
@@ -2484,17 +2487,20 @@
       if (value != head->phi()) {
         msg = "unhandled shift in address";
       } else {
+        found_index = true;
         shift = n;
         assert(type2aelembytes(store->as_Mem()->memory_type(), true) == 1 << shift->in(2)->get_int(), "scale should match");
       }
     } else if (n->Opcode() == Op_ConvI2L && conv == NULL) {
       if (n->in(1) == head->phi()) {
+        found_index = true;
         conv = n;
       } else {
         msg = "unhandled input to ConvI2L";
       }
     } else if (n == head->phi()) {
       // no shift, check below for allowed cases
+      found_index = true;
     } else {
       msg = "unhandled node in address";
       msg_node = n;
@@ -2506,6 +2512,10 @@
     msg_node = store;
   }
 
+  if (!found_index) {
+    msg = "missing use of index";
+  }
+
   // byte sized items won't have a shift
   if (msg == NULL && shift == NULL && t != T_BYTE && t != T_BOOLEAN) {
     msg = "can't find shift";