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