[llvm] [InstCombine] Add support for Instruction combining of hyperbolic functions (PR #173730)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 6 09:33:05 PST 2026
================
@@ -3052,25 +3052,31 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
break;
}
case Intrinsic::cos:
- case Intrinsic::amdgcn_cos: {
+ case Intrinsic::amdgcn_cos:
+ case Intrinsic::cosh: {
Value *X, *Sign;
Value *Src = II->getArgOperand(0);
if (match(Src, m_FNeg(m_Value(X))) || match(Src, m_FAbs(m_Value(X))) ||
match(Src, m_CopySign(m_Value(X), m_Value(Sign)))) {
- // cos(-x) --> cos(x)
- // cos(fabs(x)) --> cos(x)
- // cos(copysign(x, y)) --> cos(x)
+ // f(-x) --> f(x)
+ // f(fabs(x)) --> f(x)
+ // f(copysign(x, y)) --> f(x)
+ // for f in {cos, cosh}
return replaceOperand(*II, 0, X);
}
break;
}
case Intrinsic::sin:
- case Intrinsic::amdgcn_sin: {
+ case Intrinsic::amdgcn_sin:
+ case Intrinsic::sinh:
+ case Intrinsic::tan:
+ case Intrinsic::tanh: {
Value *X;
if (match(II->getArgOperand(0), m_OneUse(m_FNeg(m_Value(X))))) {
- // sin(-x) --> -sin(x)
- Value *NewSin = Builder.CreateUnaryIntrinsic(IID, X, II);
- return UnaryOperator::CreateFNegFMF(NewSin, II);
+ // f(-x) --> -f(x)
+ // for f in {sin, sinh, tan, tanh}
+ Value *NewFunc = Builder.CreateUnaryIntrinsic(IID, X, II);
----------------
arsenm wrote:
Can you add some tests for flag preservation
https://github.com/llvm/llvm-project/pull/173730
More information about the llvm-commits
mailing list