Mercurial > hg > graal-compiler
changeset 1788:33a54060190d
Merge
author | twisti |
---|---|
date | Thu, 09 Sep 2010 01:43:48 -0700 |
parents | 84713fd87632 (current diff) f9883ee8ce39 (diff) |
children | a83b0246bb77 |
files | |
diffstat | 2 files changed, 26 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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()); + } + } }
--- 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";