[llvm] [InstCombine] Fold -X / -Y -> X / Y (PR #88422)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 13 04:25:17 PDT 2024
================
@@ -1581,10 +1581,24 @@ Instruction *InstCombinerImpl::visitSDiv(BinaryOperator &I) {
}
// -X / Y --> -(X / Y)
- Value *Y;
- if (match(&I, m_SDiv(m_OneUse(m_NSWNeg(m_Value(X))), m_Value(Y))))
+ if (match(Op0, m_OneUse(m_NSWNeg(m_Value(X)))))
return BinaryOperator::CreateNSWNeg(
- Builder.CreateSDiv(X, Y, I.getName(), I.isExact()));
+ Builder.CreateSDiv(X, Op1, I.getName(), I.isExact()));
+
+ // X / -Y --> -(X / Y), if X is known to not be INT_MIN,
+ // or -Y is known to not be -1.
+ Value *Y;
+ KnownBits KnownDividend = computeKnownBits(Op0, 0, &I);
+ if (match(Op1, m_OneUse(m_NSWNeg(m_Value(Y))))) {
+ KnownBits KnownDivisor = computeKnownBits(Op1, 0, &I);
+ if (!KnownDividend.getSignedMinValue().isMinSignedValue() ||
+ // FIXME: Hack for checking if is -1, which is just all ones
+ !KnownDivisor.getMaxValue().isMaxValue()) {
----------------
nikic wrote:
I don't think this case has test coverage?
https://github.com/llvm/llvm-project/pull/88422
More information about the llvm-commits
mailing list