summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2019-04-17 06:35:07 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2019-04-17 06:35:07 +0000
commit00806458469829bc0d3bfd59b9ae9925c570b2ff (patch)
tree707ef196749f4876d308a56312531ed90f3cbfc1 /llvm/lib/Transforms
parentdf44ff1b7871dc4cd178c9db7173c45b774da4fd (diff)
downloadbcm5719-llvm-00806458469829bc0d3bfd59b9ae9925c570b2ff.tar.gz
bcm5719-llvm-00806458469829bc0d3bfd59b9ae9925c570b2ff.zip
[CVP] processOverflowIntrinsic(): don't crash if constant-holding happened
As reported by Mikael Holmén in post-commit review in https://reviews.llvm.org/D60791#1469765 llvm-svn: 358559
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index b650971624a..a56a37a618b 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -416,10 +416,13 @@ static void processOverflowIntrinsic(WithOverflowInst *WO) {
IRBuilder<> B(WO);
Value *NewOp = B.CreateBinOp(
WO->getBinaryOp(), WO->getLHS(), WO->getRHS(), WO->getName());
- if (WO->isSigned())
- cast<Instruction>(NewOp)->setHasNoSignedWrap();
- else
- cast<Instruction>(NewOp)->setHasNoUnsignedWrap();
+ // Constant-holing could have happened.
+ if (auto *Inst = dyn_cast<Instruction>(NewOp)) {
+ if (WO->isSigned())
+ Inst->setHasNoSignedWrap();
+ else
+ Inst->setHasNoUnsignedWrap();
+ }
Value *NewI = B.CreateInsertValue(UndefValue::get(WO->getType()), NewOp, 0);
NewI = B.CreateInsertValue(NewI, ConstantInt::getFalse(WO->getContext()), 1);
OpenPOWER on IntegriCloud