From 1eda9bfd6129a0da4cb6e4619d230ab0e08d33f9 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sat, 6 Jun 2020 12:59:58 +0300 Subject: [PATCH] [SCEV] ScalarEvolution::createSCEV(): Instruction::Or: drop bogus no-wrap flag detection Summary: That's just really wrong. While sure, if LHS is AddRec, and we could propagate it's no-wrap flags, that doesn't make, because as long as the operands of `or` had no common bits set, then the `add` of these operands will never overflow: http://volta.cs.utah.edu:8080/z/gmt7Sy IOW we need no propagation/detection, we are free to just set NUW+NSW. But as rG39e3683534c83573da5c8b70c8adfb43948f601f shows, even when the old code failed to "deduce" flags, we'd eventually re-deduce them somewhere, later. So let's just set them. Reviewers: mkazantsev, reames, sanjoy, efriedma Reviewed By: efriedma Subscribers: efriedma, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81246 --- llvm/lib/Analysis/ScalarEvolution.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 4d7def2e4d0e..85f9794aa8d8 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -6389,15 +6389,8 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) { if (GetMinTrailingZeros(LHS) >= (CIVal.getBitWidth() - CIVal.countLeadingZeros())) { // Build a plain add SCEV. - const SCEV *S = getAddExpr(LHS, getSCEV(CI)); - // If the LHS of the add was an addrec and it has no-wrap flags, - // transfer the no-wrap flags, since an or won't introduce a wrap. - if (const SCEVAddRecExpr *NewAR = dyn_cast(S)) { - const SCEVAddRecExpr *OldAR = cast(LHS); - const_cast(NewAR)->setNoWrapFlags( - OldAR->getNoWrapFlags()); - } - return S; + return getAddExpr(LHS, getSCEV(CI), + (SCEV::NoWrapFlags)(SCEV::FlagNUW | SCEV::FlagNSW)); } } break;