[llvm] [SCEV] BECount to zero if `((-C + (C smax %x)) /u %x), C > 0` holds (PR #104580)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 5 02:40:50 PDT 2024
================
@@ -3547,6 +3547,23 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
}
}
+ // ((-C + (C smax %x)) /u %x) evaluates to zero, for any positive constant C.
+ if (const auto *AE = dyn_cast<SCEVAddExpr>(LHS);
+ AE && AE->getNumOperands() == 2) {
+ if (const auto *VC = dyn_cast<SCEVConstant>(AE->getOperand(0))) {
+ const APInt &NegC = VC->getAPInt();
+ if (NegC.isNegative() &&
+ NegC != APInt::getSignedMinValue(NegC.getBitWidth())) {
----------------
nikic wrote:
```suggestion
!NegC.isMinSignedValue()) {
```
Okay, in that case we should adjust it like this.
https://github.com/llvm/llvm-project/pull/104580
More information about the llvm-commits
mailing list