Null check object parameter of unsafe access even if it's known to be non null

Roman Kennke rkennke at redhat.com
Thu Feb 16 14:39:32 UTC 2017


Couldn't we have barriers that don't ever generate a null check? E.g.
shenandoah_read_barrier_not_null()? Or would that crash too?

Other than that, I have no objections.

Roman

Am Donnerstag, den 16.02.2017, 14:45 +0100 schrieb Roland Westrelin:
> This is the bug that Aleksey spotted on 8u but also applies to 9.
> 
> A little bit of background: An unsafe access at an offset that's
> small
> is guaranteed to be an access to an object field (or array element)
> and
> so implicitly the object is not null. Currently the C2 IR contains a
> cast in that case (that is C2 knows the object is not null but no
> null
> check is emitted). There are 2 reasons for the cast:
> 
> 1) we don't need the following barrier to check for null
> 
> 2) without it we have:
> 
> if (o != null) {
>   o = read/write barrier(o)
> } else {
>   o = null;
> }
> access to o
> 
> which c2 could transform to:
> 
> if (o != null) {
>   o = read/write barrier(o)
>   access to o
> } else {
>   o = null;
>   access to o
> }
> 
> and in the else branch c2 sees an oop access to a null object,
> something
> impossible and it crashes.
> 
> Now the current problem is if we have a check for null with both
> branches that the compiler suppose can be taken followed by an unsafe
> access to something the compiler knows is not null:
> 
> if (o != null) {
>  // do something
> } else {
>   o = null;
> }
> o = cast_non_null(o);
> o = read_barrier(o);
> i = o.f;
> 
> the compiler can push the cast in both branches:
> 
> if (o != null) {
>  // do something
>   o = cast_non_null(o);
> } else {
>   o = cast_non_null(null);
> }
> 
> o = read_barrier(o);
> i = o.f;
> 
> In the else branch, o is dead but the control flow is not. That
> inconsistency causes the compiler to crash. A fix is to change the
> cast
> to a null check. Then in the case above, the else control flow also
> becomes dead and there's no inconsistency. It's unfortunate to add a
> check for null for something we know is not but the null check should
> become an implicit null check and so be virtually free.
> 
> http://cr.openjdk.java.net/~roland/shenandoah/nullcheck_unsafeaccess/
> webrev.00/
> 
> Roland.


More information about the shenandoah-dev mailing list