forked from mirrors/gecko-dev
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:
parent
ac888af96f
commit
2ea485c39c
2 changed files with 189 additions and 0 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
Loading…
Reference in a new issue