diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ConstraintElimination.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index 97cafbce66f9..6ba38ca1703e 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -229,6 +229,12 @@ decompose(Value *V, SmallVector<PreconditionTy, 4> &Preconditions, ConstantInt *CI; if (match(V, m_NUWAdd(m_Value(Op0), m_ConstantInt(CI)))) return {{CI->getSExtValue(), nullptr}, {1, Op0}}; + if (match(V, m_Add(m_Value(Op0), m_ConstantInt(CI))) && CI->isNegative()) { + Preconditions.emplace_back( + CmpInst::ICMP_UGE, Op0, + ConstantInt::get(Op0->getType(), CI->getSExtValue() * -1)); + return {{CI->getSExtValue(), nullptr}, {1, Op0}}; + } if (match(V, m_NUWAdd(m_Value(Op0), m_Value(Op1)))) return {{0, nullptr}, {1, Op0}, {1, Op1}}; |