From 5656fe0aabbac08e4353a8448dfc6dd6803ce22c Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 16 Aug 2018 22:24:47 +0000 Subject: [PATCH] [InstrProf] Use atomic profile counter updates for TSan Thread sanitizer instrumentation fails to skip all loads and stores to profile counters. This can happen if profile counter updates are merged: %.sink = phi i64* ... %pgocount5 = load i64, i64* %.sink %27 = add i64 %pgocount5, 1 %28 = bitcast i64* %.sink to i8* call void @__tsan_write8(i8* %28) store i64 %27, i64* %.sink To suppress TSan diagnostics about racy counter updates, make the counter updates atomic when TSan is enabled. If there's general interest in this mode it can be surfaced as a clang/swift driver option. Testing: check-{llvm,clang,profile} rdar://40477803 Differential Revision: https://reviews.llvm.org/D50867 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@339955 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/BackendUtil.cpp | 5 +++++ test/CodeGen/tsan-instrprof-atomic.c | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 test/CodeGen/tsan-instrprof-atomic.c diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp index 415bd96262..826ac267c6 100644 --- a/lib/CodeGen/BackendUtil.cpp +++ b/lib/CodeGen/BackendUtil.cpp @@ -653,6 +653,11 @@ void EmitAssemblyHelper::CreatePasses(legacy::PassManager &MPM, InstrProfOptions Options; Options.NoRedZone = CodeGenOpts.DisableRedZone; Options.InstrProfileOutput = CodeGenOpts.InstrProfileOutput; + + // TODO: Surface the option to emit atomic profile counter increments at + // the driver level. + Options.Atomic = LangOpts.Sanitize.has(SanitizerKind::Thread); + MPM.add(createInstrProfilingLegacyPass(Options)); } if (CodeGenOpts.hasProfileIRInstr()) { diff --git a/test/CodeGen/tsan-instrprof-atomic.c b/test/CodeGen/tsan-instrprof-atomic.c new file mode 100644 index 0000000000..b7f99e73d3 --- /dev/null +++ b/test/CodeGen/tsan-instrprof-atomic.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 %s -emit-llvm -fprofile-instrument=clang -fsanitize=thread -o - | FileCheck %s + +// CHECK: define void @foo +// CHECK-NOT: load {{.*}}foo +// CHECK: ret void +void foo() {} -- 2.40.0