[PATCH] D11579: [InstrProfiling] Fix data race on profile counters by using AtomicRMW.

Alexey Samsonov vonosmas at gmail.com
Wed Jul 29 16:56:07 PDT 2015


Do relaxed atomics actually introduce that much of slowdown?

You're intentionally introducing a data race, this doesn't look good to me
at all. However, I'm not confident about
what's allowed in LLVM IR - it's not C++ where any source-level data race
is UB, but not an x86 assembly either.

On Wed, Jul 29, 2015 at 4:43 PM, Justin Bogner <mail at justinbogner.com>
wrote:

> 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();
> >  }
>
>


-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150729/7b92eaa3/attachment.html>


More information about the llvm-commits mailing list