< 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 >