src/hotspot/share/gc/shared/c2/barrierSetC2.cpp
changeset 58931 304c63b17b07
parent 58217 b1a394e15ae9
child 59025 b398685dd029
equal deleted inserted replaced
58930:a4ddd1667c72 58931:304c63b17b07
    94       val.set_node(new_val);
    94       val.set_node(new_val);
    95     }
    95     }
    96 
    96 
    97     store = kit->store_to_memory(kit->control(), access.addr().node(), val.node(), access.type(),
    97     store = kit->store_to_memory(kit->control(), access.addr().node(), val.node(), access.type(),
    98                                      access.addr().type(), mo, requires_atomic_access, unaligned, mismatched, unsafe);
    98                                      access.addr().type(), mo, requires_atomic_access, unaligned, mismatched, unsafe);
    99     access.set_raw_access(store);
       
   100   } else {
    99   } else {
   101     assert(!requires_atomic_access, "not yet supported");
   100     assert(!requires_atomic_access, "not yet supported");
   102     assert(access.is_opt_access(), "either parse or opt access");
   101     assert(access.is_opt_access(), "either parse or opt access");
   103     C2OptAccess& opt_access = static_cast<C2OptAccess&>(access);
   102     C2OptAccess& opt_access = static_cast<C2OptAccess&>(access);
   104     Node* ctl = opt_access.ctl();
   103     Node* ctl = opt_access.ctl();
   118     store = gvn.transform(st);
   117     store = gvn.transform(st);
   119     if (store == st) {
   118     if (store == st) {
   120       mm->set_memory_at(alias, st);
   119       mm->set_memory_at(alias, st);
   121     }
   120     }
   122   }
   121   }
       
   122   access.set_raw_access(store);
       
   123 
   123   return store;
   124   return store;
   124 }
   125 }
   125 
   126 
   126 Node* BarrierSetC2::load_at_resolved(C2Access& access, const Type* val_type) const {
   127 Node* BarrierSetC2::load_at_resolved(C2Access& access, const Type* val_type) const {
   127   DecoratorSet decorators = access.decorators();
   128   DecoratorSet decorators = access.decorators();
   151       load = kit->make_load(control, adr, val_type, access.type(), mo);
   152       load = kit->make_load(control, adr, val_type, access.type(), mo);
   152     } else {
   153     } else {
   153       load = kit->make_load(control, adr, val_type, access.type(), adr_type, mo,
   154       load = kit->make_load(control, adr, val_type, access.type(), adr_type, mo,
   154                             dep, requires_atomic_access, unaligned, mismatched, unsafe);
   155                             dep, requires_atomic_access, unaligned, mismatched, unsafe);
   155     }
   156     }
   156     access.set_raw_access(load);
       
   157   } else {
   157   } else {
   158     assert(!requires_atomic_access, "not yet supported");
   158     assert(!requires_atomic_access, "not yet supported");
   159     assert(access.is_opt_access(), "either parse or opt access");
   159     assert(access.is_opt_access(), "either parse or opt access");
   160     C2OptAccess& opt_access = static_cast<C2OptAccess&>(access);
   160     C2OptAccess& opt_access = static_cast<C2OptAccess&>(access);
   161     Node* control = control_dependent ? opt_access.ctl() : NULL;
   161     Node* control = control_dependent ? opt_access.ctl() : NULL;
   163     PhaseGVN& gvn = opt_access.gvn();
   163     PhaseGVN& gvn = opt_access.gvn();
   164     Node* mem = mm->memory_at(gvn.C->get_alias_index(adr_type));
   164     Node* mem = mm->memory_at(gvn.C->get_alias_index(adr_type));
   165     load = LoadNode::make(gvn, control, mem, adr, adr_type, val_type, access.type(), mo, dep, unaligned, mismatched);
   165     load = LoadNode::make(gvn, control, mem, adr, adr_type, val_type, access.type(), mo, dep, unaligned, mismatched);
   166     load = gvn.transform(load);
   166     load = gvn.transform(load);
   167   }
   167   }
       
   168   access.set_raw_access(load);
   168 
   169 
   169   return load;
   170   return load;
   170 }
   171 }
   171 
   172 
   172 class C2AccessFence: public StackObj {
   173 class C2AccessFence: public StackObj {
   804   Node* src_offset = ac->in(ArrayCopyNode::SrcPos);
   805   Node* src_offset = ac->in(ArrayCopyNode::SrcPos);
   805   Node* dest = ac->in(ArrayCopyNode::Dest);
   806   Node* dest = ac->in(ArrayCopyNode::Dest);
   806   Node* dest_offset = ac->in(ArrayCopyNode::DestPos);
   807   Node* dest_offset = ac->in(ArrayCopyNode::DestPos);
   807   Node* length = ac->in(ArrayCopyNode::Length);
   808   Node* length = ac->in(ArrayCopyNode::Length);
   808 
   809 
   809   assert (src_offset == NULL && dest_offset == NULL, "for clone offsets should be null");
   810   assert (src_offset == NULL,  "for clone offsets should be null");
       
   811   assert (dest_offset == NULL, "for clone offsets should be null");
   810 
   812 
   811   const char* copyfunc_name = "arraycopy";
   813   const char* copyfunc_name = "arraycopy";
   812   address     copyfunc_addr =
   814   address     copyfunc_addr =
   813           phase->basictype2arraycopy(T_LONG, NULL, NULL,
   815           phase->basictype2arraycopy(T_LONG, NULL, NULL,
   814                               true, copyfunc_name, true);
   816                               true, copyfunc_name, true);