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