[9] RFR(S): 8075136: Unnecessary sign extension for byte array access (original) (raw)

Andrew Haley aph at redhat.com
Wed Mar 18 11:38:43 UTC 2015


On 03/18/2015 11:19 AM, Tobias Hartmann wrote:

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 preferable. Yes, it's because we have no operand for the indirect-with-offset (no scaling) case and therefore it is matched to 'addPregregext'. 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 INSNCOST. Otherwise, 'AddP (AddP reg (ConvI2L ireg)) off' is matched to 'addPregregext' (cost INSNCOST)

Aha! That's the bug. 'addP_reg_reg_ext' should be 2*INSN_COST, along with all the ALU extend and/or shift instructions. My bad, probably.

Thanks, Andrew.



More information about the hotspot-compiler-dev mailing list