366 return transform(ld); |
366 return transform(ld); |
367 } |
367 } |
368 |
368 |
369 Node* IdealKit::store(Node* ctl, Node* adr, Node *val, BasicType bt, |
369 Node* IdealKit::store(Node* ctl, Node* adr, Node *val, BasicType bt, |
370 int adr_idx, |
370 int adr_idx, |
371 MemNode::MemOrd mo, bool require_atomic_access) { |
371 MemNode::MemOrd mo, bool require_atomic_access, |
|
372 bool mismatched) { |
372 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory"); |
373 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory"); |
373 const TypePtr* adr_type = NULL; |
374 const TypePtr* adr_type = NULL; |
374 debug_only(adr_type = C->get_adr_type(adr_idx)); |
375 debug_only(adr_type = C->get_adr_type(adr_idx)); |
375 Node *mem = memory(adr_idx); |
376 Node *mem = memory(adr_idx); |
376 Node* st; |
377 Node* st; |
377 if (require_atomic_access && bt == T_LONG) { |
378 if (require_atomic_access && bt == T_LONG) { |
378 st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); |
379 st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); |
379 } else { |
380 } else { |
380 st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); |
381 st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); |
|
382 } |
|
383 if (mismatched) { |
|
384 st->as_Store()->set_mismatched_access(); |
381 } |
385 } |
382 st = transform(st); |
386 st = transform(st); |
383 set_memory(st, adr_idx); |
387 set_memory(st, adr_idx); |
384 |
388 |
385 return st; |
389 return st; |