< prev index next >

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int256Vector.java

Print this page
rev 55589 : 8221816: [vector] IndexOutOfBoundsException for fromArray/intoArray with unset mask lanes
Reviewed-by: duke

*** 878,901 **** @Override @ForceInline public void intoArray(int[] a, int ix) { Objects.requireNonNull(a); ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH); VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH, a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET, this, a, ix, (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e)); } @Override @ForceInline public final void intoArray(int[] a, int ax, Mask<Integer> m) { ! IntVector oldVal = IntVector.fromArray(SPECIES, a, ax); IntVector newVal = oldVal.blend(this, m); ! newVal.intoArray(a, ax); } @Override @ForceInline public void intoArray(int[] a, int ix, int[] b, int iy) { Objects.requireNonNull(a); Objects.requireNonNull(b); --- 878,912 ---- @Override @ForceInline public void intoArray(int[] a, int ix) { Objects.requireNonNull(a); ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH); + intoArrayWithoutCheck(a, ix); + } + + @ForceInline + private void intoArrayWithoutCheck(int[] a, int ix) { VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH, a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET, this, a, ix, (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e)); } @Override @ForceInline public final void intoArray(int[] a, int ax, Mask<Integer> m) { ! Objects.requireNonNull(a); ! if (ax + LENGTH <= a.length) { ! IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax); IntVector newVal = oldVal.blend(this, m); ! ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax); ! } else { ! forEach(m, (i, e) -> a[ax + i] = e); } + } + @Override @ForceInline public void intoArray(int[] a, int ix, int[] b, int iy) { Objects.requireNonNull(a); Objects.requireNonNull(b);
*** 903,926 **** // Index vector: vix[0:n] = i -> ix + indexMap[iy + i] IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix); vix = VectorIntrinsics.checkIndex(vix, a.length); VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH, Int256Vector.class, a, Unsafe.ARRAY_INT_BASE_OFFSET, vix, this, a, ix, b, iy, (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e)); } @Override @ForceInline public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) { ! // @@@ This can result in out of bounds errors for unset mask lanes ! IntVector oldVal = IntVector.fromArray(SPECIES, a, ax, b, iy); IntVector newVal = oldVal.blend(this, m); ! newVal.intoArray(a, ax, b, iy); } @Override @ForceInline public void intoByteArray(byte[] a, int ix) { --- 914,951 ---- // Index vector: vix[0:n] = i -> ix + indexMap[iy + i] IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix); vix = VectorIntrinsics.checkIndex(vix, a.length); + intoArrayWithoutCheck(a, ix, b, iy, vix); + } + + @ForceInline + private void intoArrayWithoutCheck(int[] a, int ix, int[] b, int iy, IntVector vix) { VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH, Int256Vector.class, a, Unsafe.ARRAY_INT_BASE_OFFSET, vix, this, a, ix, b, iy, (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e)); } @Override @ForceInline public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) { ! Objects.requireNonNull(a); ! Objects.requireNonNull(b); ! ! // Index vector: vix[0:n] = i -> ax + b[iy + i] ! IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ax); ! ! if(vix.lessThan(0).anyTrue() || vix.greaterThanEq(a.length).anyTrue()) { ! forEach(m, (i, e) -> a[ax + b[iy+i]] = e); ! } else { ! IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix); IntVector newVal = oldVal.blend(this, m); ! ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix); ! } } @Override @ForceInline public void intoByteArray(byte[] a, int ix) {
< prev index next >