Skip to content

Commit 9918890

Browse files
committed
fix uninitAlignedSlice
1 parent 1d79230 commit 9918890

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

source/mir/ndslice/allocation.d

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,18 +214,19 @@ auto uninitAlignedSlice(T, size_t N)(size_t[N] lengths, uint alignment) @system
214214
{
215215
immutable len = lengths.lengthsProduct;
216216
import std.array : uninitializedArray;
217-
auto barr = uninitializedArray!(byte[])(len * T.sizeof + alignment);
218-
size_t offset = alignment + size_t.sizeof * 2 - 1;
217+
assert((alignment != 0) && ((alignment & (alignment - 1)) == 0), "'alignment' must be a power of two");
218+
size_t offset = alignment <= 16 ? 0 : alignment - 1;
219219
void* basePtr = uninitializedArray!(byte[])(len * T.sizeof + offset).ptr;
220-
void* alignedPtr = cast(void**)((cast(size_t)(basePtr) + offset) & ~(alignment - 1));
221-
return (cast(T*) alignedPtr).sliced(lengths);
220+
T* alignedPtr = cast(T*)((cast(size_t)(basePtr) + offset) & ~offset);
221+
return alignedPtr.sliced(lengths);
222222
}
223223

224224
///
225225
version(mir_test)
226226
@system pure nothrow unittest
227227
{
228228
auto tensor = uninitAlignedSlice!double([5, 6, 7], 64);
229+
tensor[] = 0;
229230
assert(tensor.length == 5);
230231
assert(tensor.elementsCount == 5 * 6 * 7);
231232
assert(cast(size_t)(tensor.ptr) % 64 == 0);

0 commit comments

Comments
 (0)