diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2015-02-12 09:55:28 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2015-02-12 09:55:28 +0000 |
| commit | 2e8d82e6073419344f3f638e536cc1df1d88e0e6 (patch) | |
| tree | 424b0738b8c7974f8f160e0201134e0063f31f92 /llvm/test/Instrumentation/ThreadSanitizer/capture.ll | |
| parent | d2cb3c8876b856581216c8394a2fa55a581e87c2 (diff) | |
| download | bcm5719-llvm-2e8d82e6073419344f3f638e536cc1df1d88e0e6.tar.gz bcm5719-llvm-2e8d82e6073419344f3f638e536cc1df1d88e0e6.zip | |
tsan: do not instrument not captured values
I've built some tests in WebRTC with and without this change. With this change number of __tsan_read/write calls is reduced by 20-40%, binary size decreases by 5-10% and execution time drops by ~5%. For example:
$ ls -l old/modules_unittests new/modules_unittests
-rwxr-x--- 1 dvyukov 41708976 Jan 20 18:35 old/modules_unittests
-rwxr-x--- 1 dvyukov 38294008 Jan 20 18:29 new/modules_unittests
$ objdump -d old/modules_unittests | egrep "callq.*__tsan_(read|write|unaligned)" | wc -l
239871
$ objdump -d new/modules_unittests | egrep "callq.*__tsan_(read|write|unaligned)" | wc -l
148365
http://reviews.llvm.org/D7069
llvm-svn: 228917
Diffstat (limited to 'llvm/test/Instrumentation/ThreadSanitizer/capture.ll')
| -rw-r--r-- | llvm/test/Instrumentation/ThreadSanitizer/capture.ll | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/llvm/test/Instrumentation/ThreadSanitizer/capture.ll b/llvm/test/Instrumentation/ThreadSanitizer/capture.ll new file mode 100644 index 00000000000..d6c62f0b88b --- /dev/null +++ b/llvm/test/Instrumentation/ThreadSanitizer/capture.ll @@ -0,0 +1,91 @@ +; RUN: opt < %s -tsan -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" + +declare void @escape(i32*) + +@sink = global i32* null, align 4 + +define void @captured0() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + ; escapes due to call + call void @escape(i32* %ptr) + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured0 +; CHECK: __tsan_write +; CHECK: ret void + +define void @captured1() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + ; escapes due to store into global + store i32* %ptr, i32** @sink, align 8 + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured1 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @captured2() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + %tmp = alloca i32*, align 8 + ; transitive escape + store i32* %ptr, i32** %tmp, align 8 + %0 = load i32** %tmp, align 8 + store i32* %0, i32** @sink, align 8 + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured2 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured0() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + store i32 42, i32* %ptr, align 4 + ; escapes due to call + call void @escape(i32* %ptr) + ret void +} +; CHECK-LABEL: define void @notcaptured0 +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured1() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + store i32 42, i32* %ptr, align 4 + ; escapes due to store into global + store i32* %ptr, i32** @sink, align 8 + ret void +} +; CHECK-LABEL: define void @notcaptured1 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured2() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + %tmp = alloca i32*, align 8 + store i32 42, i32* %ptr, align 4 + ; transitive escape + store i32* %ptr, i32** %tmp, align 8 + %0 = load i32** %tmp, align 8 + store i32* %0, i32** @sink, align 8 + ret void +} +; CHECK-LABEL: define void @notcaptured2 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + + |

