diff options
author | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2019-09-26 12:16:01 +0000 |
---|---|---|
committer | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2019-09-26 12:16:01 +0000 |
commit | 163c54d288b20a394de59f808401b0a19f71a472 (patch) | |
tree | 4f3049cba9fa82b5f3fe7087e7d40c14d0713e90 /llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | |
parent | f685aa73aa815ce79116ad4447798037779b9d9a (diff) | |
download | bcm5719-llvm-163c54d288b20a394de59f808401b0a19f71a472.tar.gz bcm5719-llvm-163c54d288b20a394de59f808401b0a19f71a472.zip |
[InstCombine] Don't assume CmpInst has been visited in getFlippedStrictnessPredicateAndConstant
Summary:
Removing an assumption (assert) that the CmpInst already has been
simplified in getFlippedStrictnessPredicateAndConstant. Solution is
to simply bail out instead of hitting the assertion. Instead we
assume that any profitable rewrite will happen in the next iteration
of InstCombine.
The reason why we can't assume that the CmpInst already has been
simplified is that the worklist does not guarantee such an ordering.
Solves https://bugs.llvm.org/show_bug.cgi?id=43376
Reviewers: spatel, lebedev.ri
Reviewed By: lebedev.ri
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D68022
llvm-svn: 372972
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index b68266705e5..ddc7de39d8d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -5141,16 +5141,11 @@ llvm::getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned); }; - // For scalars, SimplifyICmpInst should have already handled - // the edge cases for us, so we just assert on them. - // For vectors, we must handle the edge cases. - if (isa<ConstantInt>(C)) { - // A <= MAX -> TRUE ; A >= MIN -> TRUE - assert(ConstantIsOk(cast<ConstantInt>(C))); + if (auto *CI = dyn_cast<ConstantInt>(C)) { + // Bail out if the constant can't be safely incremented/decremented. + if (!ConstantIsOk(CI)) + return llvm::None; } else if (Type->isVectorTy()) { - // TODO? If the edge cases for vectors were guaranteed to be handled as they - // are for scalar, we could remove the min/max checks. However, to do that, - // we would have to use insertelement/shufflevector to replace edge values. unsigned NumElts = Type->getVectorNumElements(); for (unsigned i = 0; i != NumElts; ++i) { Constant *Elt = C->getAggregateElement(i); |