[llvm] [SCEV] Preserve divisibility info when creating UMax/SMax expressions. (PR #160012)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 22 07:50:33 PDT 2025


================
@@ -15986,7 +15991,22 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
     for (const SCEV *Expr : ExprsToRewrite) {
       const SCEV *RewriteTo = Guards.RewriteMap[Expr];
       Guards.RewriteMap.erase(Expr);
-      Guards.RewriteMap.insert({Expr, Guards.rewrite(RewriteTo)});
+      const SCEV *Rewritten = Guards.rewrite(RewriteTo);
+
+      // Try to strengthen divisibility of SMax/UMax expressions coming from >=
+      // 1 conditions.
+      if (auto *SMax = dyn_cast<SCEVSMaxExpr>(Rewritten)) {
+        unsigned MinTrailingZeros = SE.getMinTrailingZeros(SMax->getOperand(1));
----------------
nikic wrote:

Use getConstantMultiple instead?

https://github.com/llvm/llvm-project/pull/160012


More information about the llvm-commits mailing list