From 484c622760e2a46aa1b52c7a791ee59543364225 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Wed, 15 Mar 2023 20:57:32 +0000 Subject: [PATCH] [SCEV] Do not strengthen nuw/nsw flags during get[Zero,Sign]ExtendedExpr. Modifying AddRecs when constructing other expressions can lead to surprising changes. It also seems like it is not really beneficial i most cases. At the moment, there's a single regression, but we still might be able to improve the flags at AddRec construction. Might help with the issue discussed in D143409. Reviewed By: mkazantsev Differential Revision: https://reviews.llvm.org/D144051 --- llvm/lib/Analysis/ScalarEvolution.cpp | 10 ---------- llvm/test/Transforms/IndVarSimplify/lftr-reuse.ll | 4 +++- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 424ff1c2..cc9abcc 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -1625,11 +1625,6 @@ const SCEV *ScalarEvolution::getZeroExtendExprImpl(const SCEV *Op, Type *Ty, unsigned BitWidth = getTypeSizeInBits(AR->getType()); const Loop *L = AR->getLoop(); - if (!AR->hasNoUnsignedWrap()) { - auto NewFlags = proveNoWrapViaConstantRanges(AR); - setNoWrapFlags(const_cast(AR), NewFlags); - } - // If we have special knowledge that this addrec won't overflow, // we don't need to do any further analysis. if (AR->hasNoUnsignedWrap()) { @@ -2009,11 +2004,6 @@ const SCEV *ScalarEvolution::getSignExtendExprImpl(const SCEV *Op, Type *Ty, unsigned BitWidth = getTypeSizeInBits(AR->getType()); const Loop *L = AR->getLoop(); - if (!AR->hasNoSignedWrap()) { - auto NewFlags = proveNoWrapViaConstantRanges(AR); - setNoWrapFlags(const_cast(AR), NewFlags); - } - // If we have special knowledge that this addrec won't overflow, // we don't need to do any further analysis. if (AR->hasNoSignedWrap()) { diff --git a/llvm/test/Transforms/IndVarSimplify/lftr-reuse.ll b/llvm/test/Transforms/IndVarSimplify/lftr-reuse.ll index 4a9f6a1..8aa698a 100644 --- a/llvm/test/Transforms/IndVarSimplify/lftr-reuse.ll +++ b/llvm/test/Transforms/IndVarSimplify/lftr-reuse.ll @@ -126,6 +126,8 @@ exit: ; Force SCEVExpander to look for an existing well-formed phi. ; Perform LFTR without generating extra preheader code. +; TODO: Recover regression after not strengthening AddRec flags during +; get[Sign,Zero]ExtendExpr for INDVARS_IV_NEXT. define void @guardedloop(ptr %matrix, ptr %vector, ; ; CHECK-LABEL: @guardedloop( @@ -146,7 +148,7 @@ define void @guardedloop(ptr %matrix, ptr %vector, ; CHECK-NEXT: [[VECTORP:%.*]] = getelementptr inbounds [0 x double], ptr [[VECTOR:%.*]], i32 0, i64 [[INDVARS_IV2]] ; CHECK-NEXT: [[V2:%.*]] = load double, ptr [[VECTORP]], align 8 ; CHECK-NEXT: call void @use(double [[V2]]) -; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], [[TMP0]] +; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], [[TMP0]] ; CHECK-NEXT: [[INDVARS_IV_NEXT3]] = add nuw nsw i64 [[INDVARS_IV2]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3]], [[WIDE_TRIP_COUNT]] ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[RETURN_LOOPEXIT:%.*]] -- 2.7.4