[PATCH] D11579: [InstrProfiling] Fix data race on profile counters by using AtomicRMW.
Justin Bogner
mail at justinbogner.com
Wed Jul 29 16:43:57 PDT 2015
Alexey Samsonov <vonosmas at gmail.com> writes:
> samsonov created this revision.
> samsonov added reviewers: dnovillo, bogner.
> samsonov added a subscriber: llvm-commits.
>
> Since we introduced counters for functions in COMDAT sections (e.g.
> inline functions from STL headers), these headers can easily be
> incremented concurrently by multiple threads. Replace load-add-store
> with a single "atomicrmw add" with monotonic memory ordering.
This significantly changes the performance characteristics of this code,
pessimizing single-threaded users and potentially making the
multithreaded performance issues even worse.
It's fine to add an option to lower these to atomics, since this does
guarantee accuracy, but I think we need a switch to choose which kind of
lowering we're interested in in that case.
> http://reviews.llvm.org/D11579
>
> Files:
> lib/Transforms/Instrumentation/InstrProfiling.cpp
>
> Index: lib/Transforms/Instrumentation/InstrProfiling.cpp
> ===================================================================
> --- lib/Transforms/Instrumentation/InstrProfiling.cpp
> +++ lib/Transforms/Instrumentation/InstrProfiling.cpp
> @@ -147,9 +147,9 @@
> IRBuilder<> Builder(Inc->getParent(), *Inc);
> uint64_t Index = Inc->getIndex()->getZExtValue();
> Value *Addr = Builder.CreateConstInBoundsGEP2_64(Counters, 0, Index);
> - Value *Count = Builder.CreateLoad(Addr, "pgocount");
> - Count = Builder.CreateAdd(Count, Builder.getInt64(1));
> - Inc->replaceAllUsesWith(Builder.CreateStore(Count, Addr));
> + Builder.CreateAtomicRMW(AtomicRMWInst::Add, Addr, Builder.getInt64(1),
> + llvm::Monotonic);
> + assert(Inc->use_empty() && "InstrProfIncrementInst has uses!");
> Inc->eraseFromParent();
> }
More information about the llvm-commits
mailing list