[compiler-rt] 03e345b - [asan] Avoid few branches on memcpy hot path

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 19:20:20 PDT 2022


Author: Vitaly Buka
Date: 2022-08-08T19:20:06-07:00
New Revision: 03e345b5198d22ac7a4fd9798010fd1da16a25ca

URL: https://github.com/llvm/llvm-project/commit/03e345b5198d22ac7a4fd9798010fd1da16a25ca
DIFF: https://github.com/llvm/llvm-project/commit/03e345b5198d22ac7a4fd9798010fd1da16a25ca.diff

LOG: [asan] Avoid few branches on memcpy hot path

Added: 
    

Modified: 
    compiler-rt/lib/asan/asan_interceptors_memintrinsics.h
    compiler-rt/lib/asan/asan_internal.h
    compiler-rt/lib/asan/asan_rtl.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/asan/asan_interceptors_memintrinsics.h b/compiler-rt/lib/asan/asan_interceptors_memintrinsics.h
index 178827ab0351..391e72b826d3 100644
--- a/compiler-rt/lib/asan/asan_interceptors_memintrinsics.h
+++ b/compiler-rt/lib/asan/asan_interceptors_memintrinsics.h
@@ -80,18 +80,14 @@ struct AsanInterceptorContext {
 // See http://llvm.org/bugs/show_bug.cgi?id=11763.
 #define ASAN_MEMCPY_IMPL(ctx, to, from, size)                 \
   do {                                                        \
-    if (UNLIKELY(!asan_inited))                               \
-      return internal_memcpy(to, from, size);                 \
-    if (asan_init_is_running) {                               \
-      return REAL(memcpy)(to, from, size);                    \
-    }                                                         \
-    ENSURE_ASAN_INITED();                                     \
-    if (LIKELY(flags()->replace_intrin)) {                    \
-      if (LIKELY(to != from)) {                             \
+    if (LIKELY(replace_intrin_cached)) {                      \
+      if (LIKELY(to != from)) {                               \
         CHECK_RANGES_OVERLAP("memcpy", to, size, from, size); \
       }                                                       \
       ASAN_READ_RANGE(ctx, from, size);                       \
       ASAN_WRITE_RANGE(ctx, to, size);                        \
+    } else if (UNLIKELY(!asan_inited)) {                      \
+      return internal_memcpy(to, from, size);                 \
     }                                                         \
     return REAL(memcpy)(to, from, size);                      \
   } while (0)
@@ -99,24 +95,17 @@ struct AsanInterceptorContext {
 // memset is called inside Printf.
 #define ASAN_MEMSET_IMPL(ctx, block, c, size) \
   do {                                        \
-    if (UNLIKELY(!asan_inited))               \
-      return internal_memset(block, c, size); \
-    if (asan_init_is_running) {               \
-      return REAL(memset)(block, c, size);    \
-    }                                         \
-    ENSURE_ASAN_INITED();                     \
-    if (LIKELY(flags()->replace_intrin)) {    \
+    if (LIKELY(replace_intrin_cached)) {      \
       ASAN_WRITE_RANGE(ctx, block, size);     \
+    } else if (UNLIKELY(!asan_inited)) {      \
+      return internal_memset(block, c, size); \
     }                                         \
     return REAL(memset)(block, c, size);      \
   } while (0)
 
 #define ASAN_MEMMOVE_IMPL(ctx, to, from, size) \
   do {                                         \
-    if (UNLIKELY(!asan_inited))                \
-      return internal_memmove(to, from, size); \
-    ENSURE_ASAN_INITED();                      \
-    if (LIKELY(flags()->replace_intrin)) {     \
+    if (LIKELY(replace_intrin_cached)) {       \
       ASAN_READ_RANGE(ctx, from, size);        \
       ASAN_WRITE_RANGE(ctx, to, size);         \
     }                                          \

diff  --git a/compiler-rt/lib/asan/asan_internal.h b/compiler-rt/lib/asan/asan_internal.h
index 9c46f225116e..959fdec26042 100644
--- a/compiler-rt/lib/asan/asan_internal.h
+++ b/compiler-rt/lib/asan/asan_internal.h
@@ -133,6 +133,7 @@ void InstallAtExitCheckLeaks();
 extern int asan_inited;
 // Used to avoid infinite recursion in __asan_init().
 extern bool asan_init_is_running;
+extern bool replace_intrin_cached;
 extern void (*death_callback)(void);
 // These magic values are written to shadow for better error
 // reporting.

diff  --git a/compiler-rt/lib/asan/asan_rtl.cpp b/compiler-rt/lib/asan/asan_rtl.cpp
index 2bbf0ac5240a..88f66de5669a 100644
--- a/compiler-rt/lib/asan/asan_rtl.cpp
+++ b/compiler-rt/lib/asan/asan_rtl.cpp
@@ -73,6 +73,7 @@ static void CheckUnwind() {
 // -------------------------- Globals --------------------- {{{1
 int asan_inited;
 bool asan_init_is_running;
+bool replace_intrin_cached;
 
 #if !ASAN_FIXED_MAPPING
 uptr kHighMemEnd, kMidMemBeg, kMidMemEnd;
@@ -451,6 +452,7 @@ static void AsanInitInternal() {
 
   // On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited
   // should be set to 1 prior to initializing the threads.
+  replace_intrin_cached = flags()->replace_intrin;
   asan_inited = 1;
   asan_init_is_running = false;
 


        


More information about the llvm-commits mailing list