Bug 1898413 - Revert clang 18 change that causes regressions in some speedometer tests. r=firefox-build-system-reviewers,sergesanspaille

This has the potential to regress other things, and if that happens,
we'll balance the pros and cons. But first, let's attempt this.

Differential Revision: https://phabricator.services.mozilla.com/D212516
This commit is contained in:
Mike Hommey 2024-06-04 06:49:43 +00:00
parent ac888af96f
commit 2ea485c39c
2 changed files with 189 additions and 0 deletions

View file

@ -6,6 +6,7 @@
"unpoison-thread-stacks_clang_10.patch",
"downgrade-mangling-error_clang_12.patch",
"fuzzing_ccov_build_clang_12.patch",
"revert-llvmorg-18-init-5259-g5d7f84ee17f3.patch",
"revert-llvmorg-16-init-11301-g163bb6d64e5f_clang_18.patch",
"revert-llvmorg-15-init-13446-g7524fe962e47.patch",
"llvmorg-19-init-7654-gc23135c5488f.patch",

View file

@ -0,0 +1,188 @@
From 9e3750d90195f63849228d388780362443840acf Mon Sep 17 00:00:00 2001
From: Mike Hommey <mh@glandium.org>
Date: Tue, 4 Jun 2024 15:29:52 +0900
Subject: [PATCH] Revert "LoopRotate: Add code to update branch weights"
This reverts commit 5d7f84ee17f3f601c49f6124a3a51e557de3ab53.
---
.../Transforms/Utils/LoopRotationUtils.cpp | 136 +-----------------
1 file changed, 4 insertions(+), 132 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
index 504f4430dc2c..49446db4d1d3 100644
--- a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp
@@ -25,8 +25,6 @@
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IntrinsicInst.h"
-#include "llvm/IR/MDBuilder.h"
-#include "llvm/IR/ProfDataUtils.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
@@ -52,9 +50,6 @@ static cl::opt<bool>
cl::desc("Allow loop rotation multiple times in order to reach "
"a better latch exit"));
-// Probability that a rotated loop has zero trip count / is never entered.
-static constexpr uint32_t ZeroTripCountWeights[] = {1, 127};
-
namespace {
/// A simple loop rotation transformation.
class LoopRotate {
@@ -273,123 +268,6 @@ static bool canRotateDeoptimizingLatchExit(Loop *L) {
return false;
}
-static void updateBranchWeights(BranchInst &PreHeaderBI, BranchInst &LoopBI,
- bool HasConditionalPreHeader,
- bool SuccsSwapped) {
- MDNode *WeightMD = getBranchWeightMDNode(PreHeaderBI);
- if (WeightMD == nullptr)
- return;
-
- // LoopBI should currently be a clone of PreHeaderBI with the same
- // metadata. But we double check to make sure we don't have a degenerate case
- // where instsimplify changed the instructions.
- if (WeightMD != getBranchWeightMDNode(LoopBI))
- return;
-
- SmallVector<uint32_t, 2> Weights;
- extractFromBranchWeightMD(WeightMD, Weights);
- if (Weights.size() != 2)
- return;
- uint32_t OrigLoopExitWeight = Weights[0];
- uint32_t OrigLoopBackedgeWeight = Weights[1];
-
- if (SuccsSwapped)
- std::swap(OrigLoopExitWeight, OrigLoopBackedgeWeight);
-
- // Update branch weights. Consider the following edge-counts:
- //
- // | |-------- |
- // V V | V
- // Br i1 ... | Br i1 ...
- // | | | | |
- // x| y| | becomes: | y0| |-----
- // V V | | V V |
- // Exit Loop | | Loop |
- // | | | Br i1 ... |
- // ----- | | | |
- // x0| x1| y1 | |
- // V V ----
- // Exit
- //
- // The following must hold:
- // - x == x0 + x1 # counts to "exit" must stay the same.
- // - y0 == x - x0 == x1 # how often loop was entered at all.
- // - y1 == y - y0 # How often loop was repeated (after first iter.).
- //
- // We cannot generally deduce how often we had a zero-trip count loop so we
- // have to make a guess for how to distribute x among the new x0 and x1.
-
- uint32_t ExitWeight0; // aka x0
- uint32_t ExitWeight1; // aka x1
- uint32_t EnterWeight; // aka y0
- uint32_t LoopBackWeight; // aka y1
- if (OrigLoopExitWeight > 0 && OrigLoopBackedgeWeight > 0) {
- ExitWeight0 = 0;
- if (HasConditionalPreHeader) {
- // Here we cannot know how many 0-trip count loops we have, so we guess:
- if (OrigLoopBackedgeWeight >= OrigLoopExitWeight) {
- // If the loop count is bigger than the exit count then we set
- // probabilities as if 0-trip count nearly never happens.
- ExitWeight0 = ZeroTripCountWeights[0];
- // Scale up counts if necessary so we can match `ZeroTripCountWeights`
- // for the `ExitWeight0`:`ExitWeight1` (aka `x0`:`x1` ratio`) ratio.
- while (OrigLoopExitWeight < ZeroTripCountWeights[1] + ExitWeight0) {
- // ... but don't overflow.
- uint32_t const HighBit = uint32_t{1} << (sizeof(uint32_t) * 8 - 1);
- if ((OrigLoopBackedgeWeight & HighBit) != 0 ||
- (OrigLoopExitWeight & HighBit) != 0)
- break;
- OrigLoopBackedgeWeight <<= 1;
- OrigLoopExitWeight <<= 1;
- }
- } else {
- // If there's a higher exit-count than backedge-count then we set
- // probabilities as if there are only 0-trip and 1-trip cases.
- ExitWeight0 = OrigLoopExitWeight - OrigLoopBackedgeWeight;
- }
- }
- ExitWeight1 = OrigLoopExitWeight - ExitWeight0;
- EnterWeight = ExitWeight1;
- LoopBackWeight = OrigLoopBackedgeWeight - EnterWeight;
- } else if (OrigLoopExitWeight == 0) {
- if (OrigLoopBackedgeWeight == 0) {
- // degenerate case... keep everything zero...
- ExitWeight0 = 0;
- ExitWeight1 = 0;
- EnterWeight = 0;
- LoopBackWeight = 0;
- } else {
- // Special case "LoopExitWeight == 0" weights which behaves like an
- // endless where we don't want loop-enttry (y0) to be the same as
- // loop-exit (x1).
- ExitWeight0 = 0;
- ExitWeight1 = 0;
- EnterWeight = 1;
- LoopBackWeight = OrigLoopBackedgeWeight;
- }
- } else {
- // loop is never entered.
- assert(OrigLoopBackedgeWeight == 0 && "remaining case is backedge zero");
- ExitWeight0 = 1;
- ExitWeight1 = 1;
- EnterWeight = 0;
- LoopBackWeight = 0;
- }
-
- const uint32_t LoopBIWeights[] = {
- SuccsSwapped ? LoopBackWeight : ExitWeight1,
- SuccsSwapped ? ExitWeight1 : LoopBackWeight,
- };
- setBranchWeights(LoopBI, LoopBIWeights);
- if (HasConditionalPreHeader) {
- const uint32_t PreHeaderBIWeights[] = {
- SuccsSwapped ? EnterWeight : ExitWeight0,
- SuccsSwapped ? ExitWeight0 : EnterWeight,
- };
- setBranchWeights(PreHeaderBI, PreHeaderBIWeights);
- }
-}
-
/// Rotate loop LP. Return true if the loop is rotated.
///
/// \param SimplifiedLatch is true if the latch was just folded into the final
@@ -509,8 +387,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
// loop. Otherwise loop is not suitable for rotation.
BasicBlock *Exit = BI->getSuccessor(0);
BasicBlock *NewHeader = BI->getSuccessor(1);
- bool BISuccsSwapped = L->contains(Exit);
- if (BISuccsSwapped)
+ if (L->contains(Exit))
std::swap(Exit, NewHeader);
assert(NewHeader && "Unable to determine new loop header");
assert(L->contains(NewHeader) && !L->contains(Exit) &&
@@ -814,14 +691,9 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
// to split as many edges.
BranchInst *PHBI = cast<BranchInst>(OrigPreheader->getTerminator());
assert(PHBI->isConditional() && "Should be clone of BI condbr!");
- const Value *Cond = PHBI->getCondition();
- const bool HasConditionalPreHeader =
- !isa<ConstantInt>(Cond) ||
- PHBI->getSuccessor(cast<ConstantInt>(Cond)->isZero()) != NewHeader;
-
- updateBranchWeights(*PHBI, *BI, HasConditionalPreHeader, BISuccsSwapped);
-
- if (HasConditionalPreHeader) {
+ if (!isa<ConstantInt>(PHBI->getCondition()) ||
+ PHBI->getSuccessor(cast<ConstantInt>(PHBI->getCondition())->isZero()) !=
+ NewHeader) {
// The conditional branch can't be folded, handle the general case.
// Split edges as necessary to preserve LoopSimplify form.
--
2.45.1.2.gf9b0626531