[llvm] [InstCombine] Simplifiy `(-x * y * -x)` into `(x * y * x)` (PR #72953)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 21 00:50:46 PST 2023
================
@@ -351,6 +351,12 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) {
// X * -Y --> -(X * Y)
if (match(&I, m_c_Mul(m_OneUse(m_Neg(m_Value(X))), m_Value(Y))))
return BinaryOperator::CreateNeg(Builder.CreateMul(X, Y));
+ // (-X * Y) * -X --> (X * Y) * X
+ // (-X << Y) * -X --> (X << Y) * X
+ if (match(Op1, m_Neg(m_Value()))) {
+ if (Value *NegOp0 = Negator::Negate(false, /*IsNSW*/ false, Op0, *this))
+ return BinaryOperator::CreateMul(NegOp0, Builder.CreateNeg(Op1));
----------------
nikic wrote:
```suggestion
if (match(Op1, m_Neg(m_Value(X)))) {
if (Value *NegOp0 = Negator::Negate(false, /*IsNSW*/ false, Op0, *this))
return BinaryOperator::CreateMul(NegOp0, X);
```
Directly generate `X` instead of `-(-X)` to reduce risk of infinite loops.
https://github.com/llvm/llvm-project/pull/72953
More information about the llvm-commits
mailing list