[llvm] [offload] expand aligned allocation API tests (PR #222558)
Weronika Lewandowska via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 17 05:28:35 PDT 2026
https://github.com/wlemkows updated https://github.com/llvm/llvm-project/pull/222558
>From 05c7b3e04f4b775d68ed5e6b6a82680d11c4193a Mon Sep 17 00:00:00 2001
From: Weronika Lewandowska <weronika.lewandowska at intel.com>
Date: Fri, 4 Sep 2026 10:49:21 +0000
Subject: [PATCH] [offload] expand aligned allocation API tests
---
.../OffloadAPI/memory/olMemAllocAligned.cpp | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/offload/unittests/OffloadAPI/memory/olMemAllocAligned.cpp b/offload/unittests/OffloadAPI/memory/olMemAllocAligned.cpp
index a894dde5ec77c..ca7a6054c41aa 100644
--- a/offload/unittests/OffloadAPI/memory/olMemAllocAligned.cpp
+++ b/offload/unittests/OffloadAPI/memory/olMemAllocAligned.cpp
@@ -10,6 +10,9 @@
#include <OffloadAPI.h>
#include <gtest/gtest.h>
+#include <cstdint>
+#include <limits>
+
using olMemAllocAlignedTest = OffloadDeviceTest;
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olMemAllocAlignedTest);
@@ -32,6 +35,10 @@ OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE_WITH_PARAM(
constexpr size_t DefaultAlignment = 16;
+static void expectAligned(void *Alloc, size_t Alignment) {
+ EXPECT_EQ(reinterpret_cast<uintptr_t>(Alloc) % Alignment, 0U);
+}
+
TEST_P(olMemAllocAlignedTest, SuccessAllocMany) {
std::vector<void *> Allocs;
Allocs.reserve(TestAllocsNum);
@@ -85,6 +92,14 @@ TEST_P(olMemAllocAlignedTest, InvalidAlignmentNotAPowerOfTwo) {
olMemAllocAligned(Device, OL_ALLOC_TYPE_DEVICE, 1024, 3, &Alloc));
}
+TEST_P(olMemAllocAlignedTest, InvalidAlignmentMaxValue) {
+ void *Alloc = nullptr;
+
+ ASSERT_ERROR(OL_ERRC_INVALID_ARGUMENT,
+ olMemAllocAligned(Device, OL_ALLOC_TYPE_DEVICE, 1024,
+ std::numeric_limits<uint32_t>::max(), &Alloc));
+}
+
TEST_P(olMemAllocAlignedTest, InvalidHostType) {
void *Alloc = nullptr;
ASSERT_ERROR(OL_ERRC_INVALID_ENUMERATION,
@@ -116,10 +131,57 @@ TEST_P(olMemAllocAlignedTypesTest, SuccessAllocDifferentAlignments) {
SCOPED_TRACE("alignment: " + std::to_string(Alignment));
ASSERT_SUCCESS(allocateDeviceOrHost(DefaultAllocSize, Alignment, &Alloc));
ASSERT_NE(Alloc, nullptr);
+ expectAligned(Alloc, Alignment);
olMemFree(Alloc);
}
}
+TEST_P(olMemAllocAlignedTypesTest, SuccessAllocDifferentSizesAndAlignments) {
+ const size_t Sizes[] = {8, 512, 2048};
+ const size_t Alignments[] = {4, 8, 16, 32, 64};
+
+ for (size_t Size : Sizes) {
+ for (size_t Alignment : Alignments) {
+ SCOPED_TRACE("size: " + std::to_string(Size) +
+ ", alignment: " + std::to_string(Alignment));
+
+ void *Alloc = nullptr;
+ std::vector<uint8_t> Input(Size, 42);
+ std::vector<uint8_t> Output(Size, 0);
+
+ ASSERT_SUCCESS(allocateDeviceOrHost(Size, Alignment, &Alloc));
+ ASSERT_NE(Alloc, nullptr);
+ expectAligned(Alloc, Alignment);
+
+ ASSERT_SUCCESS(
+ olMemcpy(nullptr, Alloc, Device, Input.data(), Host, Size));
+ ASSERT_SUCCESS(
+ olMemcpy(nullptr, Output.data(), Host, Alloc, Device, Size));
+ EXPECT_EQ(Output, Input);
+
+ ASSERT_SUCCESS(olMemFree(Alloc));
+ }
+ }
+}
+
+TEST_P(olMemAllocAlignedTypesTest, SuccessAllocAboveMemoryManagerThreshold) {
+ const size_t Size = 16 * 1024;
+ const size_t Alignment = 64;
+ std::vector<uint8_t> Input(Size, 42);
+ std::vector<uint8_t> Output(Size, 0);
+ void *Alloc = nullptr;
+
+ ASSERT_SUCCESS(allocateDeviceOrHost(Size, Alignment, &Alloc));
+ ASSERT_NE(Alloc, nullptr);
+ expectAligned(Alloc, Alignment);
+
+ ASSERT_SUCCESS(olMemcpy(nullptr, Alloc, Device, Input.data(), Host, Size));
+ ASSERT_SUCCESS(olMemcpy(nullptr, Output.data(), Host, Alloc, Device, Size));
+ EXPECT_EQ(Output, Input);
+
+ ASSERT_SUCCESS(olMemFree(Alloc));
+}
+
TEST_P(olMemAllocAlignedTypesTest, SuccessMemcpyDiferentAlignments) {
void *Alloc;
std::vector<uint8_t> Input(DefaultAllocSize, 42);
@@ -132,6 +194,8 @@ TEST_P(olMemAllocAlignedTypesTest, SuccessMemcpyDiferentAlignments) {
Alignment = Alignments[i];
SCOPED_TRACE("alignment: " + std::to_string(Alignment));
ASSERT_SUCCESS(allocateDeviceOrHost(DefaultAllocSize, Alignment, &Alloc));
+ ASSERT_NE(Alloc, nullptr);
+ expectAligned(Alloc, Alignment);
// memcpy is synchronous when queue is unspecified.
ASSERT_SUCCESS(
olMemcpy(nullptr, Alloc, Device, Input.data(), Host, DefaultAllocSize));
More information about the llvm-commits
mailing list