diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index e7f983a00e30..6c3adf00c189 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -330,6 +330,19 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) { return BinaryOperator::CreateMul(X, X); } + { + Value *X, *Y; + // abs(X) * abs(Y) -> abs(X * Y) + if (I.hasNoSignedWrap() && + match(Op0, + m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(X), m_One()))) && + match(Op1, m_OneUse(m_Intrinsic<Intrinsic::abs>(m_Value(Y), m_One())))) + return replaceInstUsesWith( + I, Builder.CreateBinaryIntrinsic(Intrinsic::abs, + Builder.CreateNSWMul(X, Y), + Builder.getTrue())); + } + // -X * C --> X * -C Value *X, *Y; Constant *Op1C; |