< prev index next >
src/hotspot/share/opto/compile.cpp
Print this page
@@ -2180,11 +2180,16 @@
// Find MergeMem nodes and flattened array accesses
for (uint i = 0; i < wq.size(); i++) {
Node* n = wq.at(i);
if (n->is_Mem()) {
- const TypePtr* adr_type = get_adr_type(get_alias_index(n->adr_type()));
+ const TypePtr* adr_type = NULL;
+ if (n->Opcode() == Op_StoreCM) {
+ adr_type = get_adr_type(get_alias_index(n->in(MemNode::OopStore)->adr_type()));
+ } else {
+ adr_type = get_adr_type(get_alias_index(n->adr_type()));
+ }
if (adr_type == TypeAryPtr::VALUES) {
memnodes.push(n);
}
} else if (n->is_MergeMem()) {
MergeMemNode* mm = n->as_MergeMem();
@@ -2220,14 +2225,24 @@
int start_alias = num_alias_types()-1;
int stop_alias = 0;
for (uint i = 0; i < memnodes.size(); i++) {
Node* m = memnodes.at(i);
- const TypePtr* adr_type = m->adr_type();
+ const TypePtr* adr_type = NULL;
+ if (m->Opcode() == Op_StoreCM) {
+ adr_type = m->in(MemNode::OopStore)->adr_type();
+ Node* clone = new StoreCMNode(m->in(MemNode::Control), m->in(MemNode::Memory), m->in(MemNode::Address),
+ m->adr_type(), m->in(MemNode::ValueIn), m->in(MemNode::OopStore),
+ get_alias_index(adr_type));
+ igvn.register_new_node_with_optimizer(clone);
+ igvn.replace_node(m, clone);
+ } else {
+ adr_type = m->adr_type();
#ifdef ASSERT
m->as_Mem()->set_adr_type(adr_type);
#endif
+ }
int idx = get_alias_index(adr_type);
start_alias = MIN2(start_alias, idx);
stop_alias = MAX2(stop_alias, idx);
}
< prev index next >