NullCheckOp

Deneau, Tom tom.deneau at amd.com
Thu Jan 2 14:16:22 PST 2014


Thomas --

To overcome the problem mentioned below, I made the following one line change in GuardLoweringPhase.
However, I am wondering if there should be a target-specific boolean indicating whether
a target could support implicitNullChecks rather than just a single global option.
That way, if you are compiling for two different targets (say cpu and gpu), one could
use implicit null checks and one could use explicit.

-- Tom D.

     3.1 --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Tue Dec 24 16:03:03 2013 -0600
     3.2 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Mon Dec 30 08:03:01 2013 -0600
     3.3 @@ -143,7 +143,7 @@
     3.4          protected void processNode(Node node) {
     3.5              if (node instanceof GuardNode) {
     3.6                  GuardNode guard = (GuardNode) node;
     3.7 -                FixedWithNextNode lowered = guard.lowerGuard();
     3.8 +                FixedWithNextNode lowered = (OptImplicitNullChecks.getValue() ? guard.lowerGuard() : null);
     3.9                  if (lowered != null) {
    3.10                      replaceCurrent(lowered);
    3.11                  } else {
    3.12                      lowerToIf(guard);
    3.13                  }

> -----Original Message-----
> From: Deneau, Tom
> Sent: Saturday, December 28, 2013 9:00 AM
> To: 'Thomas Wuerthinger'
> Cc: graal-dev at openjdk.java.net; Christian Thalinger
> Subject: RE: NullCheckOp
> 
> Thomas --
> 
> I tried -G:-OptImplicitNullChecks, it did not make any difference.
> I think the problem is here:
> 
>     private static void processBlock(Block block, SchedulePhase
> schedule, int implicitNullCheckLimit) {
>         if (OptImplicitNullChecks.getValue() && implicitNullCheckLimit >
> 0) {
>             new
> UseImplicitNullChecks(implicitNullCheckLimit).processNodes(block,
> schedule);
>         }
>         new LowerGuards(block).processNodes(block, schedule);
>     }
> 
> In that we still go thru LowerGuards.processNodes which eventually gets
> to GuardNode.lowerGuard and the if block conditions are all met here so
> the NullCheckNode is created...
> 
>     public FixedWithNextNode lowerGuard() {
>         if (negated() && condition() instanceof IsNullNode) {
>             IsNullNode isNull = (IsNullNode) condition();
>             NullCheckNode nullCheck = graph().add(new
> NullCheckNode(isNull.object()));
>             setCondition(null);
>             if (isNull.usages().isEmpty()) {
>                 isNull.safeDelete();
>             }
>             return nullCheck;
>         }
> 
>         return null;
>     }
> 
> I have confirmed that if I force GuardNode.lowerGuard to just return
> null, the explicit null comparison and deopt node works correctly.
> 
> -- Tom
> 
> 
> 
> > -----Original Message-----
> > From: Thomas Wuerthinger [mailto:thomas.wuerthinger at oracle.com]
> > Sent: Saturday, December 28, 2013 6:41 AM
> > To: Deneau, Tom
> > Cc: graal-dev at openjdk.java.net; Christian Thalinger
> > Subject: Re: NullCheckOp
> >
> > Tom,
> >
> > The flag "OptImplicitNullChecks" controls whether the compiler tries
> > to create implicit null check instructions. If you set it to false,
> > the code generated is equivalent to a comparison of the value against
> > null and a deoptimization if the comparison yields true.
> >
> > - thomas
> >
> > On 24 Dec 2013, at 03:45, Christian Thalinger
> > <christian.thalinger at oracle.com> wrote:
> >
> > > I'm not an expert on this but it seems that a NullCheckOp (or a
> > NullCheckNode) only does an implicit null check; there is no branch
> > information attached to it.
> > >
> > > In order to do an explicit exception you'd need to add nodes to the
> > graph that throw the exception.  Not sure if something like this
> > exists already.
> > >
> > > On Dec 23, 2013, at 1:24 PM, Deneau, Tom <tom.deneau at amd.com> wrote:
> > >
> > >> I am trying to get null checks working on the hsail backend.
> > >> What is required of NullCheckOp in the HSAILLIRGenerator?
> > >> On Hsail, we can't support an implicit exception for this like
> > >> amd64
> > does  so I think we would just want to end up with an explicit compare
> > and branch if null to something that would be similar to the code
> > emitted for a deoptimizing node.  How much of that does NullCheckOp
> > have to do?
> > >>
> > >> -- Tom
> > >
> >




More information about the graal-dev mailing list