[PATCH] D10979: Update the branch weight metadata in JumpThreading pass.
Duncan P. N. Exon Smith via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 20:58:48 PDT 2015
> On 2015-Oct-01, at 13:53, Cong Hou <congh at google.com> wrote:
>
> Ping?
>
> thanks,
> Cong
>
> On Thu, Sep 24, 2015 at 11:35 AM, Cong Hou <congh at google.com> wrote:
> Hi Duncan
>
> Could you please take a look at this patch? Thank you!
>
>
> thanks,
> Cong
>
> On Tue, Sep 1, 2015 at 10:34 AM, Cong Hou <congh at google.com> wrote:
> Hi Duncan
>
> Could you please take a look at this patch. It is refined again and now should look better.
>
> Thanks!
>
> Cong
>
> ---------- Forwarded message ----------
> From: Cong Hou <congh at google.com>
> Date: Mon, Aug 31, 2015 at 11:14 AM
> Subject: Re: [PATCH] D10979: Update the branch weight metadata in JumpThreading pass.
> To: congh at google.com, chandlerc at gmail.com, davidxl at google.com, dexonsmith at apple.com
> Cc: dnovillo at google.com, llvm-commits at lists.llvm.org
>
>
> congh updated this revision to Diff 33602.
> congh added a comment.
>
> Update the patch by adding the definition of MachineBranchProbabilityInfo::normalizeEdgeWeights().
>
>
> http://reviews.llvm.org/D10979
>
> Files:
> include/llvm/Analysis/BlockFrequencyInfo.h
> include/llvm/Analysis/BlockFrequencyInfoImpl.h
> include/llvm/CodeGen/MachineBranchProbabilityInfo.h
> include/llvm/Support/BlockFrequency.h
> lib/Analysis/BlockFrequencyInfo.cpp
> lib/Analysis/BlockFrequencyInfoImpl.cpp
> lib/Analysis/BranchProbabilityInfo.cpp
> lib/Support/BlockFrequency.cpp
> lib/Transforms/Scalar/JumpThreading.cpp
> test/Transforms/JumpThreading/update-edge-weight.ll
>
>
>
>
This close, just a bunch of low-level stuff. (Sorry for the long delay,
somehow I missed all the pings until now.)
Happy for you to fix up/move `normalizeEdgeWeights()` as a follow-up.
LGTM after you address the rest.
> Index: lib/Support/BlockFrequency.cpp
> ===================================================================
> --- lib/Support/BlockFrequency.cpp
> +++ lib/Support/BlockFrequency.cpp
> @@ -23,8 +23,7 @@
> return *this;
> }
>
> -const BlockFrequency
> -BlockFrequency::operator*(const BranchProbability &Prob) const {
> +BlockFrequency BlockFrequency::operator*(const BranchProbability &Prob) const {
This appears to be NFC. Please commit it separately.
> BlockFrequency Freq(Frequency);
> Freq *= Prob;
> return Freq;
> @@ -52,11 +51,25 @@
> return *this;
> }
>
> -const BlockFrequency
> -BlockFrequency::operator+(const BlockFrequency &Prob) const {
> - BlockFrequency Freq(Frequency);
> - Freq += Prob;
> - return Freq;
> +BlockFrequency BlockFrequency::operator+(const BlockFrequency &Freq) const {
> + BlockFrequency NewFreq(Frequency);
> + NewFreq += Freq;
> + return NewFreq;
This part of the patch seems to be NFC. Please commit it separately to
simplify the patch.
> +}
> +
> +BlockFrequency &BlockFrequency::operator-=(const BlockFrequency &Freq) {
> + // If underflow, set frequency to 0.
> + if (Frequency < Freq.Frequency)
> + Frequency = 0;
> + else
> + Frequency -= Freq.Frequency;
> + return *this;
> +}
> +
> +BlockFrequency BlockFrequency::operator-(const BlockFrequency &Freq) const {
> + BlockFrequency NewFreq(Frequency);
> + NewFreq -= Freq;
> + return NewFreq;
> }
Please commit this new API separately and add good unit tests for it
(either `-=` or `-`, no need to test both).
>
> BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
> Index: lib/Analysis/BranchProbabilityInfo.cpp
> ===================================================================
> --- lib/Analysis/BranchProbabilityInfo.cpp
> +++ lib/Analysis/BranchProbabilityInfo.cpp
> @@ -604,7 +604,7 @@
> Weight += MapI->second;
> }
> }
> - return (!FoundWeight) ? DEFAULT_WEIGHT : Weight;
> + return FoundWeight ? Weight : DEFAULT_WEIGHT;
This change seems completely unrelated (and non-functional). Please
split things like this out into separate NFC commits.
> }
>
> /// Set the edge weight for a given edge specified by PredBlock and an index
> Index: lib/Analysis/BlockFrequencyInfoImpl.cpp
> ===================================================================
> --- lib/Analysis/BlockFrequencyInfoImpl.cpp
> +++ lib/Analysis/BlockFrequencyInfoImpl.cpp
> @@ -530,6 +530,13 @@
> return Freqs[Node.Index].Scaled;
> }
>
> +void BlockFrequencyInfoImplBase::setBlockFreq(const BlockNode &Node,
> + uint64_t Freq) {
> + assert(Node.isValid() && "Expected valid node");
> + assert(Node.Index < Freqs.size() && "Expected legal index");
> + Freqs[Node.Index].Integer = Freq;
> +}
> +
> std::string
> BlockFrequencyInfoImplBase::getBlockName(const BlockNode &Node) const {
> return std::string();
> Index: lib/Analysis/BlockFrequencyInfo.cpp
> ===================================================================
> --- lib/Analysis/BlockFrequencyInfo.cpp
> +++ lib/Analysis/BlockFrequencyInfo.cpp
> @@ -129,6 +129,12 @@
> return BFI ? BFI->getBlockFreq(BB) : 0;
> }
>
> +void BlockFrequencyInfo::setBlockFreq(const BasicBlock *BB,
> + uint64_t Freq) {
> + assert(BFI && "Expected analysis to be available");
> + BFI->setBlockFreq(BB, Freq);
> +}
> +
> /// Pop up a ghostview window with the current block frequency propagation
> /// rendered using dot.
> void BlockFrequencyInfo::view() const {
> Index: include/llvm/Support/BlockFrequency.h
> ===================================================================
> --- include/llvm/Support/BlockFrequency.h
> +++ include/llvm/Support/BlockFrequency.h
> @@ -38,16 +38,20 @@
> /// \brief Multiplies with a branch probability. The computation will never
> /// overflow.
> BlockFrequency &operator*=(const BranchProbability &Prob);
> - const BlockFrequency operator*(const BranchProbability &Prob) const;
> + BlockFrequency operator*(const BranchProbability &Prob) const;
>
> /// \brief Divide by a non-zero branch probability using saturating
> /// arithmetic.
> BlockFrequency &operator/=(const BranchProbability &Prob);
> BlockFrequency operator/(const BranchProbability &Prob) const;
>
> /// \brief Adds another block frequency using saturating arithmetic.
> BlockFrequency &operator+=(const BlockFrequency &Freq);
> - const BlockFrequency operator+(const BlockFrequency &Freq) const;
> + BlockFrequency operator+(const BlockFrequency &Freq) const;
These changes seem to be NFC. Please commit them separately.
> +
> + /// \brief Subtract another block frequency using saturating arithmetic.
> + BlockFrequency &operator-=(const BlockFrequency &Freq);
> + BlockFrequency operator-(const BlockFrequency &Freq) const;
>
> /// \brief Shift block frequency to the right by count digits saturating to 1.
> BlockFrequency &operator>>=(const unsigned count);
> Index: include/llvm/CodeGen/MachineBranchProbabilityInfo.h
> ===================================================================
> --- include/llvm/CodeGen/MachineBranchProbabilityInfo.h
> +++ include/llvm/CodeGen/MachineBranchProbabilityInfo.h
> @@ -83,8 +83,34 @@
> raw_ostream &printEdgeProbability(raw_ostream &OS,
> const MachineBasicBlock *Src,
> const MachineBasicBlock *Dst) const;
> +
> + // Normalize a list of weights by scaling them down so that the sum of them
> + // doesn't exceed UINT32_MAX. Return the scale.
> + template <class WeightList>
> + static uint32_t normalizeEdgeWeights(WeightList &Weights);
I wonder if this should be a free function, maybe in `BlockFrequency.h`?
In particular, it seems like a good candidate for unit testing.
Although I'm not sure it's templated on the right thing; perhaps it
should take two iterators?
> };
>
> +template <class WeightList>
> +uint32_t
> +MachineBranchProbabilityInfo::normalizeEdgeWeights(WeightList &Weights) {
> + assert(Weights.size() < UINT32_MAX && "Too many weights in the list!");
> + // First we compute the sum with 64-bits of precision.
> + uint64_t Sum = std::accumulate(Weights.begin(), Weights.end(), uint64_t(0));
> +
> + // If the computed sum fits in 32-bits, we're done.
> + if (Sum <= UINT32_MAX)
> + return 1;
> +
> + // Otherwise, compute the scale necessary to cause the weights to fit, and
> + // re-sum with that scale applied.
> + assert((Sum / UINT32_MAX) < UINT32_MAX &&
> + "The sum of weights exceeds UINT32_MAX^2!");
> + uint32_t Scale = (Sum / UINT32_MAX) + 1;
> + for (auto &W : Weights)
> + W /= Scale;
> + return Scale;
> +}
> +
> }
>
>
More information about the llvm-commits
mailing list