[llvm] [WIP][IndVarSimplify] Fix Masking Issue by Adding nsw/nuw Flags to Trunc Instruction (PR #150179)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 24 01:53:21 PDT 2025
================
@@ -1049,9 +1049,28 @@ linearFunctionTestReplace(Loop *L, BasicBlock *ExitingBB,
if (Extended) {
bool Discard;
L->makeLoopInvariant(ExitCnt, Discard);
- } else
+ } else{
CmpIndVar = Builder.CreateTrunc(CmpIndVar, ExitCnt->getType(),
"lftr.wideiv");
+
+ // Set the correct wrap flag to avoid the masking issue.
+ Instruction *TruncInst = dyn_cast<Instruction>(CmpIndVar);
+
+ // The TruncatedIV is incrementing.
+ if (const SCEVAddRecExpr *TruncAR =
+ dyn_cast<SCEVAddRecExpr>(TruncatedIV)) {
+ // If TruncIV does not cause self-wrap, explicitly add the nsw and nuw
+ // flags to TruncInst.
+ if (TruncAR->hasNoSelfWrap()) {
+ TruncInst->setHasNoSignedWrap();
+ TruncInst->setHasNoUnsignedWrap();
----------------
lukel97 wrote:
I think NUW and NSW imply NW, not the other way around, so I don't think we can apply NUW/NSW on trunc here
https://github.com/llvm/llvm-project/pull/150179
More information about the llvm-commits
mailing list