[llvm] [LSR] Remove unnecessary WidestFixupType (NFC) (PR #185013)
John Brawn via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 6 07:25:13 PST 2026
https://github.com/john-brawn-arm updated https://github.com/llvm/llvm-project/pull/185013
>From 432d3ad6f7e8dc9836e2b9c96fb56854db0fd08b Mon Sep 17 00:00:00 2001
From: John Brawn <john.brawn at arm.com>
Date: Thu, 5 Mar 2026 16:59:10 +0000
Subject: [PATCH 1/2] [LSR] Remove unnecessary WidestFixupType (NFC)
The purpose of WidestFixupType is to prevent FindUseWithSimilarFormula
from matching a formula with different widest fixup type, but this
never happens:
* FindUseWithSimilarFormula is only called by
NarrowSearchSpaceByCollapsingUnrolledCode
* That function only considers Address and ICmpZero kinds, as they're
the only ones that allow a nonzero BaseOffset
* In an Address use all fixups have pointer type
* FindUseWithSimilarFormula already excludes ICmpZero uses
---
.../Transforms/Scalar/LoopStrengthReduce.cpp | 28 ++++++-------------
1 file changed, 9 insertions(+), 19 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 839942fac6716..4d65b2e7f8c0a 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -1326,12 +1326,6 @@ class LSRUse {
/// changing the formula.
bool RigidFormula = false;
- /// This records the widest use type for any fixup using this
- /// LSRUse. FindUseWithSimilarFormula can't consider uses with different max
- /// fixup widths to be equivalent, because the narrower one may be relying on
- /// the implicit truncation to truncate away bogus bits.
- Type *WidestFixupType = nullptr;
-
/// A list of ways to build a value that can satisfy this user. After the
/// list is populated, one of these is selected heuristically and used to
/// formulate a replacement for OperandValToReplace in UserInst.
@@ -1792,9 +1786,6 @@ void LSRUse::print(raw_ostream &OS) const {
if (AllFixupsUnconditional)
OS << ", all-fixups-unconditional";
-
- if (WidestFixupType)
- OS << ", widest fixup type: " << *WidestFixupType;
}
LLVM_DUMP_METHOD void LSRUse::dump() const {
@@ -2872,7 +2863,6 @@ LSRInstance::FindUseWithSimilarFormula(const Formula &OrigF,
if (&LU != &OrigLU &&
LU.Kind != LSRUse::ICmpZero &&
LU.Kind == OrigLU.Kind && OrigLU.AccessTy == LU.AccessTy &&
- LU.WidestFixupType == OrigLU.WidestFixupType &&
LU.HasFormulaWithSameRegs(OrigF)) {
// Scan through this use's formulae.
for (const Formula &F : LU.Formulae) {
@@ -3638,11 +3628,6 @@ void LSRInstance::CollectFixupsAndInitialFormulae() {
VisitedLSRUse.insert(LUIdx);
}
- if (!LU.WidestFixupType ||
- SE.getTypeSizeInBits(LU.WidestFixupType) <
- SE.getTypeSizeInBits(LF.OperandValToReplace->getType()))
- LU.WidestFixupType = LF.OperandValToReplace->getType();
-
// If this is the first use of this LSRUse, give it a formula.
if (LU.Formulae.empty()) {
InsertInitialFormula(S, LU, LUIdx);
@@ -3833,10 +3818,6 @@ LSRInstance::CollectLoopInvariantFixupsAndFormulae() {
LF.Offset = Offset;
LU.AllFixupsOutsideLoop &= LF.isUseFullyOutsideLoop(L);
LU.AllFixupsUnconditional &= IsFixupExecutedEachIncrement(LF);
- if (!LU.WidestFixupType ||
- SE.getTypeSizeInBits(LU.WidestFixupType) <
- SE.getTypeSizeInBits(LF.OperandValToReplace->getType()))
- LU.WidestFixupType = LF.OperandValToReplace->getType();
InsertSupplementalFormula(US, LU, LUIdx);
CountRegisters(LU.Formulae.back(), Uses.size() - 1);
break;
@@ -4958,6 +4939,8 @@ void LSRInstance::NarrowSearchSpaceByCollapsingUnrolledCode() {
for (const Formula &F : LU.Formulae) {
if (F.BaseOffset.isZero() || (F.Scale != 0 && F.Scale != 1))
continue;
+ assert((LU.Kind == LSRUse::Address || LU.Kind == LSRUse::ICmpZero) &&
+ "Only address and cmp uses expected to have nonzero BaseOffset");
LSRUse *LUThatHas = FindUseWithSimilarFormula(F, LU);
if (!LUThatHas)
@@ -4979,6 +4962,13 @@ void LSRInstance::NarrowSearchSpaceByCollapsingUnrolledCode() {
LLVM_DEBUG(dbgs() << "New fixup has offset " << Fixup.Offset << '\n');
}
+#ifndef NDEBUG
+ Type *FixupType = LUThatHas->Fixups[0].OperandValToReplace->getType();
+ for (LSRFixup &Fixup : LUThatHas->Fixups)
+ assert(Fixup.OperandValToReplace->getType() == FixupType &&
+ "Expected all fixups to have the same type");
+#endif
+
// Delete formulae from the new use which are no longer legal.
bool Any = false;
for (size_t i = 0, e = LUThatHas->Formulae.size(); i != e; ++i) {
>From bb97339bedcb61b9242bc285136fe6cab84730c6 Mon Sep 17 00:00:00 2001
From: John Brawn <john.brawn at arm.com>
Date: Fri, 6 Mar 2026 15:24:55 +0000
Subject: [PATCH 2/2] clang-format
---
llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 4d65b2e7f8c0a..c1e17658c4b9c 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -2860,8 +2860,7 @@ LSRInstance::FindUseWithSimilarFormula(const Formula &OrigF,
// Ignore ICmpZero uses because they may contain formulae generated by
// GenerateICmpZeroScales, in which case adding fixup offsets may
// be invalid.
- if (&LU != &OrigLU &&
- LU.Kind != LSRUse::ICmpZero &&
+ if (&LU != &OrigLU && LU.Kind != LSRUse::ICmpZero &&
LU.Kind == OrigLU.Kind && OrigLU.AccessTy == LU.AccessTy &&
LU.HasFormulaWithSameRegs(OrigF)) {
// Scan through this use's formulae.
More information about the llvm-commits
mailing list