[llvm] Redesign Straight-Line Strength Reduction (SLSR) (PR #162930)
Fei Peng via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 10 22:50:53 PDT 2025
================
@@ -561,118 +1067,164 @@ void StraightLineStrengthReduce::allocateCandidatesAndFindBasisForGEP(
DL->getIndexSizeInBits(GEP->getAddressSpace())) {
// Skip factoring if TruncatedArrayIdx is wider than the pointer size,
// because TruncatedArrayIdx is implicitly truncated to the pointer size.
- factorArrayIndex(TruncatedArrayIdx, BaseExpr, ElementSize, GEP);
+ allocateCandidatesAndFindBasis(Candidate::GEP, BaseExpr, ElementSizeIdx,
+ TruncatedArrayIdx, GEP);
}
IndexExprs[I - 1] = OrigIndexExpr;
}
}
-// A helper function that unifies the bitwidth of A and B.
-static void unifyBitWidth(APInt &A, APInt &B) {
- if (A.getBitWidth() < B.getBitWidth())
- A = A.sext(B.getBitWidth());
- else if (A.getBitWidth() > B.getBitWidth())
- B = B.sext(A.getBitWidth());
-}
-
Value *StraightLineStrengthReduce::emitBump(const Candidate &Basis,
const Candidate &C,
IRBuilder<> &Builder,
const DataLayout *DL) {
- APInt Idx = C.Index->getValue(), BasisIdx = Basis.Index->getValue();
- unifyBitWidth(Idx, BasisIdx);
- APInt IndexOffset = Idx - BasisIdx;
+ auto CreateMul = [&](Value *LHS, Value *RHS) {
+ if (isa<ConstantInt>(RHS)) {
+ APInt ConstRHS = cast<ConstantInt>(RHS)->getValue();
+ IntegerType *DeltaType =
+ IntegerType::get(C.Ins->getContext(), ConstRHS.getBitWidth());
+ if (ConstRHS.isPowerOf2()) {
+ ConstantInt *Exponent =
+ ConstantInt::get(DeltaType, ConstRHS.logBase2());
+ return Builder.CreateShl(LHS, Exponent);
----------------
fiigii wrote:
Hmm, for this shl, sometimes we may preserve nsw/nuw. I can give it a try in future PRs.
https://github.com/llvm/llvm-project/pull/162930
More information about the llvm-commits
mailing list