# HG changeset patch # User twisti # Date 1284021828 25200 # Node ID 33a54060190dcf6ca180b1e847d0cde1d6e53e3b # Parent 84713fd87632b911ea9108df5a52398e68cda0ef# Parent f9883ee8ce39f37069ef74336d1e3c147bc30508 Merge diff -r 84713fd87632 -r 33a54060190d src/share/vm/opto/graphKit.cpp --- a/src/share/vm/opto/graphKit.cpp Wed Sep 08 04:50:26 2010 -0700 +++ b/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()); + } + } } diff -r 84713fd87632 -r 33a54060190d src/share/vm/opto/loopTransform.cpp --- a/src/share/vm/opto/loopTransform.cpp Wed Sep 08 04:50:26 2010 -0700 +++ b/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";