Author: Guillaume Chatelet Date: 2021-01-06T12:04:53Z New Revision: aa9db51ef69f36775e9babd2f4b23142967784ee
URL: https://github.com/llvm/llvm-project/commit/aa9db51ef69f36775e9babd2f4b23142967784ee DIFF: https://github.com/llvm/llvm-project/commit/aa9db51ef69f36775e9babd2f4b23142967784ee.diff LOG: [libc] Align src buffer instead of dst buffer We used to align destination buffer instead of source buffer for the loop of block copy. This is a mistake. Differential Revision: https://reviews.llvm.org/D93457 Added: Modified: libc/src/string/memory_utils/memcpy_utils.h libc/test/src/string/memory_utils/memcpy_utils_test.cpp Removed: ################################################################################ diff --git a/libc/src/string/memory_utils/memcpy_utils.h b/libc/src/string/memory_utils/memcpy_utils.h index aa27b3c38dbd..1e7d907d2333 100644 --- a/libc/src/string/memory_utils/memcpy_utils.h +++ b/libc/src/string/memory_utils/memcpy_utils.h @@ -90,7 +90,7 @@ static void CopyAlignedBlocks(char *__restrict dst, const char *__restrict src, CopyBlock<kBlockSize>(dst, src); // Copy first block // Copy aligned blocks - const size_t ofla = offset_from_last_aligned<kBlockSize>(dst); + const size_t ofla = offset_from_last_aligned<kBlockSize>(src); const size_t limit = count + ofla - kBlockSize; for (size_t offset = kBlockSize; offset < limit; offset += kBlockSize) CopyBlock<kBlockSize>(dst - ofla + offset, src - ofla + offset); diff --git a/libc/test/src/string/memory_utils/memcpy_utils_test.cpp b/libc/test/src/string/memory_utils/memcpy_utils_test.cpp index 93c0c48c8976..d466495357c2 100644 --- a/libc/test/src/string/memory_utils/memcpy_utils_test.cpp +++ b/libc/test/src/string/memory_utils/memcpy_utils_test.cpp @@ -162,14 +162,14 @@ TEST(MemcpyUtilsTest, CopyBlockOverlap) { TEST(MemcpyUtilsTest, CopyAlignedBlocks) { auto &trace = GetTrace(); - // Destination is aligned and multiple of alignment. + // Source is aligned and multiple of alignment. // "1111" trace.Clear(); CopyAlignedBlocks<4>(I(0), I(0), 4); EXPECT_STREQ(trace.Write(), "2222"); EXPECT_STREQ(trace.Read(), "2222"); - // Destination is aligned and multiple of alignment. + // Source is aligned and multiple of alignment. // "11110000" // + "00001111" // = "11111111" @@ -178,7 +178,7 @@ TEST(MemcpyUtilsTest, CopyAlignedBlocks) { EXPECT_STREQ(trace.Write(), "11111111"); EXPECT_STREQ(trace.Read(), "11111111"); - // Destination is aligned already overlap at end. + // Source is aligned already overlap at end. // "1111000000000" // + "0000111100000" // + "0000000011110" @@ -189,26 +189,26 @@ TEST(MemcpyUtilsTest, CopyAlignedBlocks) { EXPECT_STREQ(trace.Write(), "1111111112221"); EXPECT_STREQ(trace.Read(), "1111111112221"); - // Misaligned destination. + // Misaligned source. // "01111000000000" // + "00001111000000" // + "00000000111100" // + "00000000001111" // = "01112111112211" trace.Clear(); - CopyAlignedBlocks<4>(I(1), I(0), 13); - EXPECT_STREQ(trace.Write(), "01112111112211"); - EXPECT_STREQ(trace.Read(), "1112111112211"); + CopyAlignedBlocks<4>(I(0), I(1), 13); + EXPECT_STREQ(trace.Write(), "1112111112211"); + EXPECT_STREQ(trace.Read(), "01112111112211"); - // Misaligned destination aligned at end. + // Misaligned source aligned at end. // "011110000000" // + "000011110000" // + "000000001111" // = "011121111111" trace.Clear(); - CopyAlignedBlocks<4>(I(1), I(0), 11); - EXPECT_STREQ(trace.Write(), "011121111111"); - EXPECT_STREQ(trace.Read(), "11121111111"); + CopyAlignedBlocks<4>(I(0), I(1), 11); + EXPECT_STREQ(trace.Write(), "11121111111"); + EXPECT_STREQ(trace.Read(), "011121111111"); } TEST(MemcpyUtilsTest, MaxReloads) { _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits