regression for compressed oops that require shift and add

Roland Schatz roland.schatz at oracle.com
Tue Jun 3 09:04:23 UTC 2014


Tom,

You're right, this is a regression in Graal. The "instanceof 
ObjectStamp" tests in CompressionNode and StampTool should actually be 
"instanceof AbstractObjectStamp".
I wonder why we're never hitting this bug in the AMD64 backend, at least 
on some of our benchmarks we have a heap base != 0.

I'm currently pushing a fix.

-- Roland

On 06/03/2014 12:28 AM, Deneau, Tom wrote:
> Doug --
>
> To reproduce the failure you can run this single junit test
>     mx unittest -Xmx31g  IntStreamNullCheckNonZeroBciTest
>
> This test purposely passes in a null object pointer in its input array.
>
> It looks like the problem is in CompressionNode.generate
>          if (getInput().stamp() instanceof ObjectStamp) {
>              nonNull = StampTool.isObjectNonNull(getInput().stamp());
>          } else {
>              // metaspace pointers are never null
>              nonNull = true;
>          }
>
> The stamp is NarrowOopStamp which now extends AbstractObjectStamp, so nonNull is always true,
> and in the hsail LIR code we don't generate the code to test for null.
>
> I don't know the best way to fix this.
> Note that if we replace ObjectStamp above with AbstractObjectStamp, there is then another
> similar test in StampTool.isObjectNonNull.
>
> If I just ignore the nonNull parameter in HSAILMove.UncompressPointer, my test passes but of course
> the codegen is sub-optimal.
>
> -- Tom
>
>
>> -----Original Message-----
>> From: graal-dev [mailto:graal-dev-bounces at openjdk.java.net] On Behalf Of
>> Deneau, Tom
>> Sent: Monday, June 02, 2014 6:54 AM
>> To: Doug Simon
>> Cc: graal-dev at openjdk.java.net
>> Subject: RE: regression for compressed oops that require shift and add
>>
>> Doug --
>>
>> I will try to get some more details on this.
>>
>> -- Tom
>>
>>> -----Original Message-----
>>> From: Doug Simon [mailto:doug.simon at oracle.com]
>>> Sent: Monday, June 02, 2014 3:30 AM
>>> To: Deneau, Tom
>>> Cc: graal-dev at openjdk.java.net
>>> Subject: Re: regression for compressed oops that require shift and add
>>>
>>> The code appears to be correct for the AMD64 backend (i.e.
>>> UncompressPointer.emitCode()). But the HSAIL backend code looks
>>> plausibly correct as well. Do you know where the wrong code path is
>>> taken in the HSAIL backend while emitting code?
>>>
>>> -Doug
>>>
>>> On May 30, 2014, at 10:30 PM, Deneau, Tom <tom.deneau at amd.com> wrote:
>>>
>>>> All --
>>>>
>>>> I have noticed a regression when I update to the latest default tip.
>>>> This is in the area of compressed pointers.  We typically run with
>>> different heap sizes which
>>>> force different compression schemes.  The failure is in the scheme
>>> where the 32-bit compressed pointer
>>>> must be multiplied by 8 and then add a base,  we get this for
>>>> example
>>> with a max heap size of 31g.
>>>> The problem is that the shift and add must only be applied if the
>>> original compressed oop is not 0.
>>>> Previous codegen (good):
>>>> 	ld_global_s32 $s1, [$d1 + 16];
>>>> 	cvt_u64_u32 $d1, $s1;
>>>> 	cmp_eq_b1_u64 $c0, $d1, 0x0;
>>>> 	mad_u64 $d1, $d1, 8, 0x7fb447fff000;     // $d1 = $d1 * 8 + base
>>>> 	cmov_b64 $d1, $c0, 0x0, $d1;             // conditionally make
>>> $d1 0 if it was originally 0
>>>> Current codegen (bad);
>>>> 	ld_global_s32 $s1, [$d1 + 16];
>>>> 	cvt_u64_u32 $d1, $s1;
>>>> 	mad_u64 $d1, $d1, 8, 0x7f0137fff000;
>>>>
>>>> The other compression schemes seem to work ok.
>>>> I confess I had not merged with default for a few weeks so my
>>>> previous
>>> working version was based on default 8d0242a07f7e.  But I'm not sure
>>> where the regression happened in between there.
>>>> I guess you would not notice this in your gate unless you ran with a
>>> heap size big enough to cause this kind of compression.
>>>> -- Tom
>>>>



More information about the graal-dev mailing list