src/share/vm/opto/graphKit.cpp

Print this page
rev 5127 : 8023597: Optimize G1 barriers code for unsafe load_store
Summary: Avoid loading old values in G1 pre-barriers for inlined unsafe load_store nodes.


3534                                     Node* obj,
3535                                     Node* adr,
3536                                     uint alias_idx,
3537                                     Node* val,
3538                                     const TypeOopPtr* val_type,
3539                                     Node* pre_val,
3540                                     BasicType bt) {
3541 
3542   // Some sanity checks
3543   // Note: val is unused in this routine.
3544 
3545   if (do_load) {
3546     // We need to generate the load of the previous value
3547     assert(obj != NULL, "must have a base");
3548     assert(adr != NULL, "where are loading from?");
3549     assert(pre_val == NULL, "loaded already?");
3550     assert(val_type != NULL, "need a type");
3551   } else {
3552     // In this case both val_type and alias_idx are unused.
3553     assert(pre_val != NULL, "must be loaded already");


3554     assert(pre_val->bottom_type()->basic_type() == T_OBJECT, "or we shouldn't be here");
3555   }
3556   assert(bt == T_OBJECT, "or we shouldn't be here");
3557 
3558   IdealKit ideal(this, true);
3559 
3560   Node* tls = __ thread(); // ThreadLocalStorage
3561 
3562   Node* no_ctrl = NULL;
3563   Node* no_base = __ top();
3564   Node* zero  = __ ConI(0);
3565   Node* zeroX = __ ConX(0);
3566 
3567   float likely  = PROB_LIKELY(0.999);
3568   float unlikely  = PROB_UNLIKELY(0.999);
3569 
3570   BasicType active_type = in_bytes(PtrQueue::byte_width_of_active()) == 4 ? T_INT : T_BYTE;
3571   assert(in_bytes(PtrQueue::byte_width_of_active()) == 4 || in_bytes(PtrQueue::byte_width_of_active()) == 1, "flag width");
3572 
3573   // Offsets into the thread




3534                                     Node* obj,
3535                                     Node* adr,
3536                                     uint alias_idx,
3537                                     Node* val,
3538                                     const TypeOopPtr* val_type,
3539                                     Node* pre_val,
3540                                     BasicType bt) {
3541 
3542   // Some sanity checks
3543   // Note: val is unused in this routine.
3544 
3545   if (do_load) {
3546     // We need to generate the load of the previous value
3547     assert(obj != NULL, "must have a base");
3548     assert(adr != NULL, "where are loading from?");
3549     assert(pre_val == NULL, "loaded already?");
3550     assert(val_type != NULL, "need a type");
3551   } else {
3552     // In this case both val_type and alias_idx are unused.
3553     assert(pre_val != NULL, "must be loaded already");
3554     // Nothing to be done if pre_val is null.
3555     if (pre_val->bottom_type() == TypePtr::NULL_PTR) return;
3556     assert(pre_val->bottom_type()->basic_type() == T_OBJECT, "or we shouldn't be here");
3557   }
3558   assert(bt == T_OBJECT, "or we shouldn't be here");
3559 
3560   IdealKit ideal(this, true);
3561 
3562   Node* tls = __ thread(); // ThreadLocalStorage
3563 
3564   Node* no_ctrl = NULL;
3565   Node* no_base = __ top();
3566   Node* zero  = __ ConI(0);
3567   Node* zeroX = __ ConX(0);
3568 
3569   float likely  = PROB_LIKELY(0.999);
3570   float unlikely  = PROB_UNLIKELY(0.999);
3571 
3572   BasicType active_type = in_bytes(PtrQueue::byte_width_of_active()) == 4 ? T_INT : T_BYTE;
3573   assert(in_bytes(PtrQueue::byte_width_of_active()) == 4 || in_bytes(PtrQueue::byte_width_of_active()) == 1, "flag width");
3574 
3575   // Offsets into the thread