--- old/src/share/vm/opto/memnode.cpp 2014-08-15 15:55:33.132409512 +0200 +++ new/src/share/vm/opto/memnode.cpp 2014-08-15 15:55:33.036409507 +0200 @@ -2441,6 +2441,15 @@ if (can_reshape) { // (%%% is this an anachronism?) set_req_X(MemNode::Memory, mem->in(MemNode::Memory), phase->is_IterGVN()); + Node* value = mem->in(MemNode::ValueIn); + if (value != NULL && value->is_Load()) { + // If value is a LoadNode, add its users to the IVGN worklist to + // allow optimizations based on the new state of the LoadNode. + // For example, MemBarNode::Ideal may remove the LoadNode from + // its MemBarNode::Precedent input. + phase->is_IterGVN()->add_users_to_worklist(value); + } + phase->is_IterGVN()->remove_dead_node(mem); } else { // It's OK to do this in the parser, since DU info is always accurate, // and the parser always refers to nodes via SafePointNode maps. @@ -2958,7 +2967,7 @@ if ((my_mem->Opcode() == Op_DecodeN) && (my_mem->in(1)->outcnt() > 1)) { Node* load_node = my_mem->in(1); set_req(MemBarNode::Precedent, load_node); - phase->is_IterGVN()->_worklist.push(my_mem); + phase->is_IterGVN()->remove_dead_node(my_mem); my_mem = load_node; } else { assert(my_mem->unique_out() == this, "sanity");