RFR: 8073093: AARCH64: C2 generates poor code for ByteBuffer accesses

Andrew Haley aph at redhat.com
Tue Feb 17 14:22:39 UTC 2015


On 02/17/2015 10:53 AM, Andrew Haley wrote:
> I see.  So the question could also be whether escape analysis would
> notice that a ByteBuffer does not escape.  I hope to know that soon.

Close but no cigar.

    long getLong(byte[] bytes, int i) {
        return ByteBuffer.wrap(bytes).getLong(i);
    }

Everything gets inlined nicely and the ByteBuffer is not created, but
a store fence remains because of the final fields in HeapByteBuffer.

So the resulting code for getLong (minus the prologue and epilogue) looks like this:

  0x000003ff7426dc34: ldr	w11, [x2,#12]   ;*arraylength
                                                ; - java.nio.ByteBuffer::wrap at 3 (line 396)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 1 (line 23)
                                                ; implicit exception: dispatches to 0x000003ff7426dca4
  ;; B2: #	B5 B3 <- B1  Freq: 0.999999

  0x000003ff7426dc38: dmb	ish             ;*synchronization entry
                                                ; - java.nio.HeapByteBuffer::<init>@-1 (line 84)
                                                ; - java.nio.ByteBuffer::wrap at 7 (line 373)
                                                ; - java.nio.ByteBuffer::wrap at 4 (line 396)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 1 (line 23)

  0x000003ff7426dc3c: sub	w12, w11, w3    ;*isub
                                                ; - java.nio.Buffer::checkIndex at 10 (line 545)
                                                ; - java.nio.HeapByteBuffer::getLong at 18 (line 465)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 5 (line 23)

  0x000003ff7426dc40: cmp	w3, #0x0
  0x000003ff7426dc44: b.lt	0x000003ff7426dc70  ;*iflt
                                                ; - java.nio.Buffer::checkIndex at 1 (line 545)
                                                ; - java.nio.HeapByteBuffer::getLong at 18 (line 465)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 5 (line 23)

  ;; B3: #	B6 B4 <- B2  Freq: 0.999999

  0x000003ff7426dc48: cmp	w12, #0x8
  0x000003ff7426dc4c: b.lt	0x000003ff7426dc88  ;*if_icmple
                                                ; - java.nio.Buffer::checkIndex at 11 (line 545)
                                                ; - java.nio.HeapByteBuffer::getLong at 18 (line 465)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 5 (line 23)

  ;; B4: #	N92 <- B3  Freq: 0.999998

  0x000003ff7426dc50: add	x10, x2, w3, sxtw
  0x000003ff7426dc54: ldr	x10, [x10,#16]
  0x000003ff7426dc58: rev	x0, x10         ;*invokestatic reverseBytes
                                                ; - java.nio.Bits::swap at 1 (line 61)
                                                ; - java.nio.HeapByteBuffer::getLong at 41 (line 466)
                                                ; - bytebuffertests.ByteBufferTests3::getLong at 5 (line 23)

If it weren't for the stray DMB ISH it'd be almost perfect.

Andrew.



More information about the core-libs-dev mailing list