Fix base::IsAligned() to work with const pointers.

One variant of base::IsAligned() takes a void*, but that does not work
for const float*. Change the parameter type to const void*, add a unit
test for it, and convert some code in media/ that can use IsAligned().

Change-Id: Iae7f8d5057dc947ebb85839a0b10e33f21ac207a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2246838
Reviewed-by: Dale Curtis <[email protected]>
Reviewed-by: Brian Geffon <[email protected]>
Commit-Queue: Lei Zhang <[email protected]>
Cr-Commit-Position: refs/heads/master@{#778522}
diff --git a/base/memory/aligned_memory.h b/base/memory/aligned_memory.h
index 04d08b6..39a823a 100644
--- a/base/memory/aligned_memory.h
+++ b/base/memory/aligned_memory.h
@@ -75,7 +75,7 @@
 
 #undef SUPPORTS_BUILTIN_IS_ALIGNED
 
-inline bool IsAligned(void* val, size_t alignment) {
+inline bool IsAligned(const void* val, size_t alignment) {
   return IsAligned(reinterpret_cast<uintptr_t>(val), alignment);
 }
 
diff --git a/base/memory/aligned_memory_unittest.cc b/base/memory/aligned_memory_unittest.cc
index e067b4c..810f2e4 100644
--- a/base/memory/aligned_memory_unittest.cc
+++ b/base/memory/aligned_memory_unittest.cc
@@ -38,6 +38,10 @@
       static_cast<float*>(AlignedAlloc(8, 8)));
   EXPECT_TRUE(p.get());
   EXPECT_TRUE(IsAligned(p.get(), 8));
+
+  // Make sure IsAligned() can check const pointers as well.
+  const float* const_p = p.get();
+  EXPECT_TRUE(IsAligned(const_p, 8));
 }
 
 TEST(AlignedMemoryTest, IsAligned) {
diff --git a/media/base/vector_math.cc b/media/base/vector_math.cc
index fabb796..a0333cb6 100644
--- a/media/base/vector_math.cc
+++ b/media/base/vector_math.cc
@@ -8,6 +8,7 @@
 #include <algorithm>
 
 #include "base/check_op.h"
+#include "base/memory/aligned_memory.h"
 #include "build/build_config.h"
 
 // NaCl does not allow intrinsics.
@@ -40,9 +41,8 @@
 namespace vector_math {
 
 void FMAC(const float src[], float scale, int len, float dest[]) {
-  // Ensure |src| and |dest| are 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
+  DCHECK(base::IsAligned(src, kRequiredAlignment));
+  DCHECK(base::IsAligned(dest, kRequiredAlignment));
   return FMAC_FUNC(src, scale, len, dest);
 }
 
@@ -52,9 +52,8 @@
 }
 
 void FMUL(const float src[], float scale, int len, float dest[]) {
-  // Ensure |src| and |dest| are 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
+  DCHECK(base::IsAligned(src, kRequiredAlignment));
+  DCHECK(base::IsAligned(dest, kRequiredAlignment));
   return FMUL_FUNC(src, scale, len, dest);
 }
 
@@ -65,8 +64,7 @@
 
 std::pair<float, float> EWMAAndMaxPower(
     float initial_value, const float src[], int len, float smoothing_factor) {
-  // Ensure |src| is 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
+  DCHECK(base::IsAligned(src, kRequiredAlignment));
   return EWMAAndMaxPower_FUNC(initial_value, src, len, smoothing_factor);
 }
 
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index a28321f8..002cd3b 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -20,6 +20,7 @@
 #include "base/containers/queue.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
+#include "base/memory/aligned_memory.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/memory/weak_ptr.h"
@@ -556,7 +557,7 @@
     const char* src_ptr = &src_data[0];
     for (size_t i = 0; i < num_planes; i++) {
       // Assert that each plane of frame starts at required byte boundary.
-      ASSERT_EQ(0u, dest_offset & (test::kPlatformBufferAlignment - 1))
+      ASSERT_TRUE(base::IsAligned(dest_offset, test::kPlatformBufferAlignment))
           << "Planes of frame should be mapped per platform requirements";
       char* dst_ptr = &test_stream->aligned_in_file_data[dest_offset];
       for (size_t j = 0; j < visible_plane_rows[i]; j++) {