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

src/share/vm/opto/memnode.cpp

Print this page
rev 8052 : castpp gcm
rev 8568 : 8086046: escape analysis generates incorrect code as of B67
Summary: load bypasses arraycopy that sets the value after the ArrayCopyNode is expanded
Reviewed-by:

*** 106,138 **** 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))) { 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)) { 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"); --- 106,143 ---- extern void print_alias_types(); #endif ! 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()) { ! 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