[llvm] [SCEV] Directly use NUW on mul in getUDivExpr (PR #217235)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 19 01:21:22 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Ramkumar Ramachandra (artagnon)
<details>
<summary>Changes</summary>
Eliminate the roundabout and expensive zero extend expressions, and use the wrap flags on the expression directly.
Proof: https://alive2.llvm.org/ce/z/e7YFi_
---
Full diff: https://github.com/llvm/llvm-project/pull/217235.diff
1 Files Affected:
- (modified) llvm/lib/Analysis/ScalarEvolution.cpp (+2-5)
``````````diff
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 1707c6c17fe23..826e1afbe084e 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -3581,16 +3581,13 @@ const SCEV *ScalarEvolution::getUDivExpr(SCEVUse LHS, SCEVUse RHS) {
}
// (A*B)/C --> A*(B/C) if safe and B/C can be folded.
if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(LHS)) {
- SmallVector<SCEVUse, 4> Operands;
- for (const SCEV *Op : M->operands())
- Operands.push_back(getZeroExtendExpr(Op, ExtTy));
- if (getZeroExtendExpr(M, ExtTy) == getMulExpr(Operands)) {
+ if (M->hasNoUnsignedWrap()) {
// Find an operand that's safely divisible.
for (unsigned i = 0, e = M->getNumOperands(); i != e; ++i) {
const SCEV *Op = M->getOperand(i);
const SCEV *Div = getUDivExpr(Op, RHSC);
if (!isa<SCEVUDivExpr>(Div) && getMulExpr(Div, RHSC) == Op) {
- Operands = SmallVector<SCEVUse, 4>(M->operands());
+ SmallVector<SCEVUse, 4> Operands(M->operands());
Operands[i] = Div;
return getMulExpr(Operands);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/217235
More information about the llvm-commits
mailing list