[llvm] [InstCombine] Fold abs(a * abs(b)) --> abs(a * b) (PR #78110)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 17 11:32:27 PST 2024


================
@@ -1579,6 +1579,18 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
     if (match(IIOperand, m_Select(m_Value(), m_Neg(m_Value(X)), m_Deferred(X))))
       return replaceOperand(*II, 0, X);
 
+    Value *Y;
+    // abs(a * abs(b)) -> abs(a * b)
+    if (match(IIOperand,
+              m_OneUse(m_c_Mul(m_Value(X),
+                               m_Intrinsic<Intrinsic::abs>(m_Value(Y)))))) {
+      auto *XY =
+          (cast<Instruction>(IIOperand)->hasNoSignedWrap() && IntMinIsPoison)
+              ? Builder.CreateNSWMul(X, Y)
+              : Builder.CreateMul(X, Y);
+      return replaceOperand(*II, 0, XY);
----------------
nikic wrote:

```suggestion
      bool NSW = cast<Instruction>(IIOperand)->hasNoSignedWrap() && IntMinIsPoison;
      return replaceOperand(*II, 0, Builder.CreateMul(X, Y, "", false, NSW));
```

https://github.com/llvm/llvm-project/pull/78110


More information about the llvm-commits mailing list