summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
diff options
context:
space:
mode:
authorDenis Bakhvalov <denis.bakhvalov@intel.com>2019-07-08 18:03:43 +0000
committerDenis Bakhvalov <denis.bakhvalov@intel.com>2019-07-08 18:03:43 +0000
commit74be349bcff4a4e420d7a9d487b9c6c04bff0582 (patch)
treefa79e044be1e71696a2b0a9fef2cadff760f048e /llvm/lib/Analysis/ScalarEvolutionExpander.cpp
parent77ccc04700ca8831b1358442431154b3ff054cd7 (diff)
downloadbcm5719-llvm-74be349bcff4a4e420d7a9d487b9c6c04bff0582.tar.gz
bcm5719-llvm-74be349bcff4a4e420d7a9d487b9c6c04bff0582.zip
[SCEV] Fix for PR42397. SCEVExpander wrongly adds nsw to shl instruction.
Change-Id: I76c9f628c092ae3e6e78ebdaf55cec726e25d692 llvm-svn: 365363
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolutionExpander.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolutionExpander.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
index 16d0bd64bf0..e8a95d35482 100644
--- a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -838,9 +838,13 @@ Value *SCEVExpander::visitMulExpr(const SCEVMulExpr *S) {
if (match(W, m_Power2(RHS))) {
// Canonicalize Prod*(1<<C) to Prod<<C.
assert(!Ty->isVectorTy() && "vector types are not SCEVable");
+ auto NWFlags = S->getNoWrapFlags();
+ // clear nsw flag if shl will produce poison value.
+ if (RHS->logBase2() == RHS->getBitWidth() - 1)
+ NWFlags = ScalarEvolution::clearFlags(NWFlags, SCEV::FlagNSW);
Prod = InsertBinop(Instruction::Shl, Prod,
- ConstantInt::get(Ty, RHS->logBase2()),
- S->getNoWrapFlags(), /*IsSafeToHoist*/ true);
+ ConstantInt::get(Ty, RHS->logBase2()), NWFlags,
+ /*IsSafeToHoist*/ true);
} else {
Prod = InsertBinop(Instruction::Mul, Prod, W, S->getNoWrapFlags(),
/*IsSafeToHoist*/ true);
OpenPOWER on IntegriCloud