summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-07-10 12:45:56 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-07-10 12:45:56 +0000
commitb1e6561b90176255765474f4bb8ead7112f790c3 (patch)
tree4bd7cacf69d5947dab92f9e97406ae3734c23c7a /lib
parent53aa313f962535087170613bdd18766c54918e90 (diff)
downloadcompiler-rt-b1e6561b90176255765474f4bb8ead7112f790c3.tar.gz
[msan] Fix performance issue in fast_memset.
Fast path was never triggered when called from __msan_poison. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@212715 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/msan/msan_interceptors.cc11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc
index 79c7fc17b..339469088 100644
--- a/lib/msan/msan_interceptors.cc
+++ b/lib/msan/msan_interceptors.cc
@@ -1264,13 +1264,14 @@ void *fast_memset(void *ptr, int c, SIZE_T n) {
// hack until we have a really fast internal_memset
if (sizeof(uptr) == 8 &&
(n % 8) == 0 &&
- ((uptr)ptr % 8) == 0 &&
- (c == 0 || c == -1)) {
- // Printf("memset %p %zd %x\n", ptr, n, c);
- uptr to_store = c ? -1L : 0L;
+ ((uptr)ptr % 8) == 0) {
+ uptr c8 = (unsigned)c & 0xFF;
+ c8 = (c8 << 8) | c8;
+ c8 = (c8 << 16) | c8;
+ c8 = (c8 << 32) | c8;
uptr *p = (uptr*)ptr;
for (SIZE_T i = 0; i < n / 8; i++)
- p[i] = to_store;
+ p[i] = c8;
return ptr;
}
return internal_memset(ptr, c, n);