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