[llvm] [InstCombine] Fold -X / -Y -> X / Y (PR #88422)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 11 12:13:21 PDT 2024
================
@@ -1572,21 +1572,36 @@ Instruction *InstCombinerImpl::visitSDiv(BinaryOperator &I) {
// -X / C --> X / -C (if the negation doesn't overflow).
// TODO: This could be enhanced to handle arbitrary vector constants by
// checking if all elements are not the min-signed-val.
- if (!Op1C->isMinSignedValue() &&
- match(Op0, m_NSWSub(m_Zero(), m_Value(X)))) {
+ if (!Op1C->isMinSignedValue() && match(Op0, m_NSWNeg(m_Value(X)))) {
Constant *NegC = ConstantInt::get(Ty, -(*Op1C));
Instruction *BO = BinaryOperator::CreateSDiv(X, NegC);
BO->setIsExact(I.isExact());
return BO;
}
}
- // -X / Y --> -(X / Y)
+ KnownBits KnownDividend = computeKnownBits(Op0, 0, &I);
Value *Y;
- if (match(&I, m_SDiv(m_OneUse(m_NSWSub(m_Zero(), m_Value(X))), m_Value(Y))))
+ // -X / -Y --> (X / Y)
+ if (!KnownDividend.getSignedMinValue().isMinSignedValue() &&
+ match(&I, m_SDiv(m_NSWNeg(m_Value(X)), m_NSWNeg(m_Value(Y))))) {
+ auto *NewDiv = BinaryOperator::CreateSDiv(X, Y);
+ NewDiv->setIsExact(I.isExact());
+ return NewDiv;
+ }
+
+ // -X / Y --> -(X / Y)
+ if (match(&I, m_SDiv(m_OneUse(m_Value(X)), m_Value(Y))))
----------------
dtcxzyw wrote:
```suggestion
if (match(&I, m_SDiv(m_OneUse(m_NSWNeg(m_Value(X))), m_Value(Y))))
```
https://github.com/llvm/llvm-project/pull/88422
More information about the llvm-commits
mailing list