[Statistics] Add a method to atomically update a statistic that contains a maximum
authorCraig Topper <craig.topper@gmail.com>
Thu, 18 May 2017 00:51:39 +0000 (00:51 +0000)
committerCraig Topper <craig.topper@gmail.com>
Thu, 18 May 2017 00:51:39 +0000 (00:51 +0000)
commit8a950275f77981c10e10e6497114f07fef62beb7
treecce4e5e5a8986be6fe78ba5c8dcc3e107369d9ed
parent9add1594d2cd5250bf6ea57bcfdb3dce676ba736
[Statistics] Add a method to atomically update a statistic that contains a maximum

Summary:
There are several places in the codebase that try to calculate a maximum value in a Statistic object. We currently do this in one of two ways:

  MaxNumFoo = std::max(MaxNumFoo, NumFoo);

or

  MaxNumFoo = (MaxNumFoo > NumFoo) ? MaxNumFoo : NumFoo;

The first version reads from MaxNumFoo one time and uncontionally rwrites to it. The second version possibly reads it twice depending on the result of the first compare.  But we have no way of knowing if the value was changed by another thread between the reads and the writes.

This patch adds a method to the Statistic object that can ensure that we only store if our value is the max and the previous max didn't change after we read it. If it changed we'll recheck if our value should still be the max or not and try again.

This spawned from an audit I'm trying to do of all places we uses the implicit conversion to unsigned on the Statistics objects. See my previous thread on llvm-dev https://groups.google.com/forum/#!topic/llvm-dev/yfvxiorKrDQ

Reviewers: dberlin, chandlerc, hfinkel, dblaikie

Reviewed By: chandlerc

Subscribers: llvm-commits, sanjoy

Differential Revision: https://reviews.llvm.org/D33301

llvm-svn: 303318
llvm/include/llvm/ADT/Statistic.h
llvm/lib/Analysis/CallGraphSCCPass.cpp
llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
llvm/lib/Transforms/Scalar/SROA.cpp