RFR(S): 8182475: C2: allow vectorization of HeapByteBuffer.putInt loops
Roland Westrelin
rwestrel at redhat.com
Mon Jun 19 16:12:26 UTC 2017
http://cr.openjdk.java.net/~roland/8182475/webrev.00/
With the following loop (straight out of Andrew's ByteBufferTest that we
discussed before):
static final ByteBuffer buf = ByteBuffer.allocate(SIZE * 4);
for (int i = 0; i < SIZE; i++) {
buf.putInt(i<<2, n);
}
}
vectorization doesn't trigger.
putInt is implemented as:
unsafe.putIntUnaligned(hb, address + checkIndex(i, 4), x, bigEndian);
The address of the StoreI nodes have the following shape:
(AddP (AddP hb (LoadL address)) (ConvI2L (LshiftI iv_phi 2)))
The LoadL is loop invariant. SWPointer::SWPointer() fails for them
because SWPointer::offset_plus_k() bails out for a long invariant. The
long invariant is only used in SuperWord::align_initial_loop_index() in
a computation for which we only keep the least significant bits. So I
think it's safe to use the long loop invariant by casting it to int in
SuperWord::align_initial_loop_index().
Roland.
More information about the hotspot-compiler-dev
mailing list