diff options
author | Denis Bakhvalov <denis.bakhvalov@intel.com> | 2019-07-08 18:03:43 +0000 |
---|---|---|
committer | Denis Bakhvalov <denis.bakhvalov@intel.com> | 2019-07-08 18:03:43 +0000 |
commit | 74be349bcff4a4e420d7a9d487b9c6c04bff0582 (patch) | |
tree | fa79e044be1e71696a2b0a9fef2cadff760f048e /llvm/lib/Analysis/ScalarEvolutionExpander.cpp | |
parent | 77ccc04700ca8831b1358442431154b3ff054cd7 (diff) | |
download | bcm5719-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.cpp | 8 |
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); |