[llvm] [SimplifyCFG] Set branch weights when merging conditional store to address (PR #154841)
Joel E. Denny via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 10 09:05:36 PDT 2025
================
@@ -190,5 +191,31 @@ LLVM_ABI bool hasExplicitlyUnknownBranchWeights(const Instruction &I);
/// Scaling the profile data attached to 'I' using the ratio of S/T.
LLVM_ABI void scaleProfData(Instruction &I, uint64_t S, uint64_t T);
+/// get the branch weights of a branch conditioned on b1 | b2, where b1 and b2
+/// are 2 booleans that are the condition of 2 branches for which we have the
+/// branch weights B1 and B2, respectivelly.
+inline SmallVector<uint64_t, 2>
+getDisjunctionWeights(const SmallVector<uint32_t, 2> &B1,
+ const SmallVector<uint32_t, 2> &B2) {
+ // for the first conditional branch, the probability the "true" case is taken
+ // is p(b1) = B1[0] / (B1[0] + B2[0]). The "false" case's probability is
+ // p(not b1) = B1[1] / (B1[0] + B1[1]).
+ // Similarly for the second conditional branch and B2.
+ //
+ // the probability of the new branch NOT being taken is:
+ // not P = p((not b1) and (not b2)) =
+ // = B1[1] / (B1[0]+B1[1]) * B2[1] / (B2[0]+B2[1]) =
+ // = B1[1] * B2[1] / (B1[0] + B1[1]) * (B2[0] + B2[1])
+ // then the probability of it being taken is: P = 1 - (not P).
+ // The denominator will be the same as above, and the numerator of P will be
+ // (B1[0] + B1[1]) * (B2[0] + B2[1]) - B1[1]*B2[1]
+ // Which then reduces to what's shown below (out of the 4 terms coming out of
+ // the product of sums, the subtracted one cancels out)
----------------
jdenny-ornl wrote:
Please use proper capitalization at the starts of sentences: https://llvm.org/docs/CodingStandards.html#commenting
https://github.com/llvm/llvm-project/pull/154841
More information about the llvm-commits
mailing list