[llvm] [ScalarEvolutionExpander] Don't drop nowrap flags on addrec expansion (PR #78199)

William Moses via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 15 10:26:05 PST 2024


https://github.com/wsmoses created https://github.com/llvm/llvm-project/pull/78199

When performing expand on a SCEVAddRecNode with nowrap applied (e.g. if deduced from an iv with an increment with nowrap), the generated multiply will not have the nowrap. This PR preserves the nowrap behavior on the generated code.

>From 1286729a394bac679f9aa57544ce3f920422a30b Mon Sep 17 00:00:00 2001
From: "William S. Moses" <gh at wsmoses.com>
Date: Mon, 15 Jan 2024 13:20:15 -0500
Subject: [PATCH] [ScalarEvolutionExpander] Don't drop nowrap flags on addrec
 expansion

---
 llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
index a1d7f0f9ba0f74..e87b430d6bee8f 100644
--- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
+++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
@@ -1254,7 +1254,8 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) {
       expand(SE.getTruncateOrNoop(
         SE.getMulExpr(SE.getUnknown(CanonicalIV),
                       SE.getNoopOrAnyExtend(S->getOperand(1),
-                                            CanonicalIV->getType())),
+                                            CanonicalIV->getType()),
+                                        S->getNoWrapFlags(SCEV::FlagNW)),
         Ty));
 
   // If this is a chain of recurrences, turn it into a closed form, using the



More information about the llvm-commits mailing list