< prev index next >

src/share/vm/opto/library_call.cpp

Print this page
rev 13055 : Implement barriers for maintaining connection matrix.


2996         if (!can_move_pre_barrier()) {
2997           newval = pre_barrier(true /* do_load*/,
2998                       control(), base, adr, alias_idx, newval, value_type->make_oopptr(),
2999                       NULL /* pre_val*/,
3000                       T_OBJECT);
3001         } // Else move pre_barrier to use load_store value, see below.
3002         else {
3003           newval = shenandoah_read_barrier_storeval(newval);
3004         }
3005         break;
3006       }
3007       case LS_cmp_swap_weak:
3008       case LS_cmp_swap:
3009       case LS_cmp_exchange: {
3010         // Same as for newval above:
3011         if (_gvn.type(oldval) == TypePtr::NULL_PTR) {
3012           oldval = _gvn.makecon(TypePtr::NULL_PTR);
3013         }
3014         // The only known value which might get overwritten is oldval.
3015         newval = pre_barrier(false /* do_load */,
3016                     control(), NULL, NULL, max_juint, newval, NULL,
3017                     oldval /* pre_val */,
3018                     T_OBJECT);
3019         break;
3020       }
3021       default:
3022         ShouldNotReachHere();
3023     }
3024 
3025 #ifdef _LP64
3026     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
3027       Node *newval_enc = _gvn.transform(new EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
3028 
3029       switch(kind) {
3030         case LS_get_set:
3031           load_store = _gvn.transform(new GetAndSetNNode(control(), mem, adr, newval_enc, adr_type, value_type->make_narrowoop()));
3032           break;
3033         case LS_cmp_swap_weak: {
3034           Node *oldval_enc = _gvn.transform(new EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
3035           load_store = _gvn.transform(new WeakCompareAndSwapNNode(control(), mem, adr, newval_enc, oldval_enc, mo));
3036           break;




2996         if (!can_move_pre_barrier()) {
2997           newval = pre_barrier(true /* do_load*/,
2998                       control(), base, adr, alias_idx, newval, value_type->make_oopptr(),
2999                       NULL /* pre_val*/,
3000                       T_OBJECT);
3001         } // Else move pre_barrier to use load_store value, see below.
3002         else {
3003           newval = shenandoah_read_barrier_storeval(newval);
3004         }
3005         break;
3006       }
3007       case LS_cmp_swap_weak:
3008       case LS_cmp_swap:
3009       case LS_cmp_exchange: {
3010         // Same as for newval above:
3011         if (_gvn.type(oldval) == TypePtr::NULL_PTR) {
3012           oldval = _gvn.makecon(TypePtr::NULL_PTR);
3013         }
3014         // The only known value which might get overwritten is oldval.
3015         newval = pre_barrier(false /* do_load */,
3016                     control(), NULL, adr, max_juint, newval, NULL,
3017                     oldval /* pre_val */,
3018                     T_OBJECT);
3019         break;
3020       }
3021       default:
3022         ShouldNotReachHere();
3023     }
3024 
3025 #ifdef _LP64
3026     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
3027       Node *newval_enc = _gvn.transform(new EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
3028 
3029       switch(kind) {
3030         case LS_get_set:
3031           load_store = _gvn.transform(new GetAndSetNNode(control(), mem, adr, newval_enc, adr_type, value_type->make_narrowoop()));
3032           break;
3033         case LS_cmp_swap_weak: {
3034           Node *oldval_enc = _gvn.transform(new EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
3035           load_store = _gvn.transform(new WeakCompareAndSwapNNode(control(), mem, adr, newval_enc, oldval_enc, mo));
3036           break;


< prev index next >