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 hotspot-dev
mailing list