[aarch64-port-dev ] RFR: 8139674: aarch64: guarantee failure in TestOptionsWithRanges.java

Vladimir Kozlov vladimir.kozlov at oracle.com
Fri Oct 16 10:13:41 UTC 2015


On 10/16/15 5:12 PM, Edward Nevill wrote:
> Hi Vladimir,
>
> Thanks for the review.
>
> On Fri, 2015-10-16 at 08:53 +0800, Vladimir Kozlov wrote:
>> I don't think removing next line is right:
>>
>> -        add(mdp, mdp, to_add);
>>
>> it shifts to next metadata cell.
>
> I believe removal of this line is correct. The old code kept mdp pointing at the current metadata cell that it was processing. This is what lead to the large negative offsets when it was trying to index the two fields at the start of the metadata structure.
>
> So in the old code, to process each metatdata cell it did.
>
>      Address mdo_arg_addr(mdp, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args);
>      profile_obj_type(tmp, mdo_arg_addr);
>
> In the revised code it does
>
>      Address mdo_arg_addr(mdp, in_bytes(TypeEntriesAtCall::argument_type_offset(i)));
>      profile_obj_type(tmp, mdo_arg_addr);
>
> 'off_to_args' is updated by 'to_add' each time round the loop.
>
>      off_to_args += to_add;
>
> So in the old code the address of the metadata cell was calculated as
>
>      mdp + in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args
>
> Note: 'in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args' always evaluates to 0!
>
> In the revised code the address is calculated as 'in_bytes(TypeEntriesAtCall::argument_type_offset(i))' which evaluates to the same address since mdp is no longer offset by 'off_to_args'.

Make sense. Thank you for explanation.

>
>>
>> Also both exit paths execute the same instruction:
>>
>> +      add(rscratch1, mdp, off_to_args);
>>
>> may be you can simplify exit without them:
>>
>>          bind(done);
>> +      add(mdp, mdp, off_to_args);
>
> I don't believe the exit can be simplified.
>
> The reason is that 'off_to_args' is different for each iteration around the loop. So in assembler what we will have is
>
>      add   x8, x0, #8 // x0 == mdp, offset to arg 0 == 8
>      blt   done
>      ...
>      add   x8, x0, #0x18 // arg 1 offset = 0x18
>      blt   done
>      ....
>
>      add   x8, x0, #0x108 // fallthru case
> done:
>      mov   x0, x8
>
> So, mdp is updated by a different immediate value in each case, so we cannot merge them into a single case

Okay, I missed that off_to_args is changing.

Looks good.

Thanks,
Vladimir

>
> done:
>      add   x0, x0, #N  // N == ???
>
> Thanks for your help,
> Ed.
>
>


More information about the aarch64-port-dev mailing list