[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