[llvm] r358559 - [CVP] processOverflowIntrinsic(): don't crash if constant-holding happened
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 16 23:35:07 PDT 2019
Author: lebedevri
Date: Tue Apr 16 23:35:07 2019
New Revision: 358559
URL: http://llvm.org/viewvc/llvm-project?rev=358559&view=rev
Log:
[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
Modified:
llvm/trunk/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll
Modified: llvm/trunk/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp?rev=358559&r1=358558&r2=358559&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp Tue Apr 16 23:35:07 2019
@@ -416,10 +416,13 @@ static void processOverflowIntrinsic(Wit
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);
Modified: llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll?rev=358559&r1=358558&r2=358559&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll (original)
+++ llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll Tue Apr 16 23:35:07 2019
@@ -715,3 +715,12 @@ while.end:
cleanup2: ; preds = %while.end
ret void
}
+
+define { i8, i1 } @signed_mul_constant_folding() {
+; CHECK-LABEL: @signed_mul_constant_folding(
+; CHECK-NEXT: ret { i8, i1 } { i8 2, i1 false }
+ %mul = call { i8, i1 } @llvm.umul.with.overflow.i8(i8 1, i8 2)
+ ret { i8, i1 } %mul
+}
+
+declare { i8, i1 } @llvm.umul.with.overflow.i8(i8, i8)
More information about the llvm-commits
mailing list