RFR(S): 8075136: Unnecessary sign extension for byte array access
tobias.hartmann at oracle.com
Wed Mar 18 11:19:06 UTC 2015
On 18.03.2015 11:27, Andrew Haley wrote:
> On 03/18/2015 09:51 AM, Tobias Hartmann wrote:
>> Byte array access:
>> 0x0000007f7453d8b4: add x10, x10, w1, sxtw
>> 0x0000007f7453d8b8: ldrsb w0, [x10,#16]
>> Char array access:
>> 0x0000007f7cb6f8b4: add x8, x10, #0x10
>> 0x0000007f7cb6f8b8: ldrh w0, [x8,w1,sxtw #1]
> Do you know why these are different? The second form is definitely
Yes, it's because we have no operand for the indirect-with-offset (no scaling) case and therefore it is matched to 'addP_reg_reg_ext'.
For this reason I added the two new operands indIndexOffsetI2L and indIndexOffsetI2LN. But even with those operands, it only works if we reduce their cost below INSN_COST. Otherwise, 'AddP (AddP reg (ConvI2L ireg)) off' is matched to 'addP_reg_reg_ext' (cost INSN_COST) and 'indOffL' (cost 0) instead of the newly added 'indIndexOffsetI2L' (cost INSN_COST) because the sum of the costs is equal.
If we reduce the cost it works just fine:
Byte array access:
0x0000007fad1c4a34: add x8, x10, #0x10
0x0000007fad1c4a38: ldrsb w0, [x8,w1,sxtw #0]
I still wonder if it would pay off to remove the sign extension completely (as we do on x86)?
More information about the hotspot-compiler-dev