[sanitizer] optimize internal_memset for the most performance critical case (16-byte...
authorKostya Serebryany <kcc@google.com>
Tue, 4 Sep 2018 22:43:30 +0000 (22:43 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 4 Sep 2018 22:43:30 +0000 (22:43 +0000)
llvm-svn: 341420

compiler-rt/lib/sanitizer_common/sanitizer_libc.cc

index 4b462bf..4032cb1 100644 (file)
@@ -73,6 +73,18 @@ void *internal_memmove(void *dest, const void *src, uptr n) {
 }
 
 void *internal_memset(void* s, int c, uptr n) {
+  // Optimize for the most performance-critical case:
+  if ((reinterpret_cast<uptr>(s) % 16) == 0 && (n % 16) == 0) {
+    u64 *p = reinterpret_cast<u64*>(s);
+    u64 *e = p + n / 8;
+    u64 v = c;
+    v |= v << 8;
+    v |= v << 16;
+    v |= v << 32;
+    for (; p < e; p += 2)
+      p[0] = p[1] = v;
+    return s;
+  }
   // The next line prevents Clang from making a call to memset() instead of the
   // loop below.
   // FIXME: building the runtime with -ffreestanding is a better idea. However