src/share/vm/opto/memnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/memnode.cpp	Fri Jun 12 14:28:03 2015
--- new/src/share/vm/opto/memnode.cpp	Fri Jun 12 14:28:01 2015

*** 106,138 **** --- 106,143 ---- extern void print_alias_types(); #endif ! static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, MergeMemNode* mm, PhaseTransform *phase) { ! if (mm->memory_at(Compile::AliasIdxRaw)->is_Proj()) { ! Node* n = mm->memory_at(Compile::AliasIdxRaw)->in(0); ! if ((n->is_ArrayCopy() && n->as_ArrayCopy()->may_modify(t_oop, phase)) || (n->is_CallLeaf() && n->as_CallLeaf()->may_modify(t_oop, phase))) { ! static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase) { ! if (n->is_Proj()) { ! n = n->in(0); ! if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) { return true; } } return false; } static bool membar_for_arraycopy(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTransform *phase) { Node* mem = mb->in(TypeFunc::Memory); + if (mem->is_MergeMem()) { ! return membar_for_arraycopy_helper(t_oop, mem->as_MergeMem(), phase); ! } else if (mem->is_Phi()) { // after macro expansion of an ArrayCopyNode we may have a Phi ! for (uint i = 1; i < mem->req(); i++) { ! if (mem->in(i) != NULL && mem->in(i)->is_MergeMem() && membar_for_arraycopy_helper(t_oop, mem->in(i)->as_MergeMem(), phase)) { ! Node* n = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); ! if (membar_for_arraycopy_helper(t_oop, n, phase)) { + return true; ! } else if (n->is_Phi()) { ! for (uint i = 1; i < n->req(); i++) { + if (n->in(i) != NULL) { + if (membar_for_arraycopy_helper(t_oop, n->in(i), phase)) { return true; } } } + } + } + return false; } Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypeOopPtr *t_oop, Node *load, PhaseGVN *phase) { assert((t_oop != NULL), "sanity");

src/share/vm/opto/memnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File