RFR (XS): C2: Missing matrix update for getAndSet intrinsic

Roman Kennke rkennke at redhat.com
Tue Mar 14 14:09:15 UTC 2017


Am 14.03.2017 um 14:56 schrieb Aleksey Shipilev:
> On 03/14/2017 01:55 PM, Roman Kennke wrote:
>> It might be better to simply call it with newval != NULL. I suspect that
>> blocking can_move_pre_barrier() might prevent some optimizations, for
>> example, getAndSet() pre-barrier doesn't actually need to load the
>> pre-value when executed after the fact. 
> I thought so too, but when I change the "moved" pre_barrier to accept new_val,
> it crashes on other asserts within C2 (f.ex. split-if barfs at graph shape).
> Doing this, basically:
>
> diff -r 99d1d76141e7 src/share/vm/opto/library_call.cpp
> --- a/src/share/vm/opto/library_call.cpp	Tue Mar 14 11:09:03 2017 +0100
> +++ b/src/share/vm/opto/library_call.cpp	Tue Mar 14 14:55:51 2017 +0100
> @@ -3115,12 +3115,12 @@
>        load_store = _gvn.transform(new DecodeNNode(load_store,
> load_store->get_ptr_type()));
>      }
>  #endif
> -    if (can_move_pre_barrier()) {
> +    if (can_move_pre_barrier() && kind == LS_get_set) {
>        // Don't need to load pre_val. The old value is returned by load_store.
>        // The pre_barrier can execute after the xchg as long as no safepoint
>        // gets inserted between them.
>        pre_barrier(false /* do_load */,
> -                  control(), NULL, NULL, max_juint, NULL, NULL,
> +                  control(), NULL, adr, max_juint, newval, NULL,
>                    load_store /* pre_val */,
>                    T_OBJECT);
>      }
>
> Yields:
>
>   #  Internal Error
> (/home/shade/trunks/shenandoah-jdk9/hotspot/src/share/vm/opto/split_if.cpp:287),
> pid=30197, tid=30218
>   #  assert(prior_n->is_Region()) failed: must be a post-dominating merge point
Grrrr!!
To be honest, there's no code path that usually returns false on
can_move_pre_barrier(). IMO, this should go to the trash bin.

>> And it also affects other intrinsics than getAndSet(). 
> Really? can_move_pre_barrier() only affects LS_get_set, as far as I can see.

I thought it also affects cas intrinsics. Must be a bad memory. :-P

Push it as-is, and also push it to Roland's to-do list? :-)

Roman



More information about the shenandoah-dev mailing list