Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions llvm/lib/Analysis/ConstantFolding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1651,6 +1651,8 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
case Intrinsic::sin:
case Intrinsic::cos:
case Intrinsic::sincos:
case Intrinsic::sinh:
case Intrinsic::cosh:
case Intrinsic::pow:
case Intrinsic::powi:
case Intrinsic::ldexp:
Expand Down Expand Up @@ -2513,6 +2515,10 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
return ConstantFoldFP(sin, APF, Ty);
case Intrinsic::cos:
return ConstantFoldFP(cos, APF, Ty);
case Intrinsic::sinh:
return ConstantFoldFP(sinh, APF, Ty);
case Intrinsic::cosh:
return ConstantFoldFP(cosh, APF, Ty);
case Intrinsic::sqrt:
return ConstantFoldFP(sqrt, APF, Ty);
case Intrinsic::amdgcn_cos:
Expand Down
190 changes: 190 additions & 0 deletions llvm/test/Transforms/InstSimplify/ConstProp/sinh-cosh-intrinsics.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=instsimplify < %s | FileCheck %s

define double @test_sinh_0() {
; CHECK-LABEL: define double @test_sinh_0() {
; CHECK-NEXT: ret double 0.000000e+00
;
%result = call double @llvm.sinh.f64(double 0.0)
ret double %result
}

define double @test_sinh_ln2() {
; CHECK-LABEL: define double @test_sinh_ln2() {
; CHECK-NEXT: ret double 0x3FE8000000000268
;
%res = call double @llvm.sinh.f64(double 0.69314718056)
ret double %res
}

define double @test_sinh_ln5() {
; CHECK-LABEL: define double @test_sinh_ln5() {
; CHECK-NEXT: ret double 0x400333333332D56D
;
%res = call double @llvm.sinh.f64(double 1.60943791243)
ret double %res
}

define <2 x double> @test_sinh_v2() {
; CHECK-LABEL: define <2 x double> @test_sinh_v2() {
; CHECK-NEXT: ret <2 x double> zeroinitializer
;
%result = call <2 x double> @llvm.sinh.v2f64(<2 x double> zeroinitializer)
ret <2 x double> %result
}

define double @test_sinh_neg0() {
; CHECK-LABEL: define double @test_sinh_neg0() {
; CHECK-NEXT: ret double -0.000000e+00
;
%res = call double @llvm.sinh.f64(double -0.0)
ret double %res
}

define double @test_sinh_poison() {
; CHECK-LABEL: define double @test_sinh_poison() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double poison)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double poison)
ret double %res
}

define double @test_sinh_undef() {
; CHECK-LABEL: define double @test_sinh_undef() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double undef)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double undef)
ret double %res
}

define double @test_sinh_snan() {
; CHECK-LABEL: define double @test_sinh_snan() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double 0x7FF0000000000001)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double 0x7ff0000000000001)
ret double %res
}

define double @test_sinh_qnan() {
; CHECK-LABEL: define double @test_sinh_qnan() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double 0x7FF8000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double 0x7ff8000000000000)
ret double %res
}

define double @test_sinh_pos_inf() {
; CHECK-LABEL: define double @test_sinh_pos_inf() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double 0x7FF0000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double 0x7ff0000000000000)
ret double %res
}

define double @test_sinh_neg_inf() {
; CHECK-LABEL: define double @test_sinh_neg_inf() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.sinh.f64(double 0xFFF0000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.sinh.f64(double 0xfff0000000000000)
ret double %res
}

define double @test_cosh_0() {
; CHECK-LABEL: define double @test_cosh_0() {
; CHECK-NEXT: ret double 1.000000e+00
;
%result = call double @llvm.cosh.f64(double 0.0)
ret double %result
}

define double @test_cosh_ln2() {
; CHECK-LABEL: define double @test_cosh_ln2() {
; CHECK-NEXT: ret double 0x3FF40000000000B8
;
%res = call double @llvm.cosh.f64(double 0.69314718056)
ret double %res
}

define double @test_cosh_ln5() {
; CHECK-LABEL: define double @test_cosh_ln5() {
; CHECK-NEXT: ret double 0x4004CCCCCCCC763D
;
%res = call double @llvm.cosh.f64(double 1.60943791243)
ret double %res
}

define <2 x double> @test_cosh_v2() {
; CHECK-LABEL: define <2 x double> @test_cosh_v2() {
; CHECK-NEXT: ret <2 x double> splat (double 1.000000e+00)
;
%result = call <2 x double> @llvm.cosh.v2f64(<2 x double> zeroinitializer)
ret <2 x double> %result
}

define double @test_cosh_neg0() {
; CHECK-LABEL: define double @test_cosh_neg0() {
; CHECK-NEXT: ret double 1.000000e+00
;
%res = call double @llvm.cosh.f64(double -0.0)
ret double %res
}

define double @test_cosh_poison() {
; CHECK-LABEL: define double @test_cosh_poison() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double poison)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double poison)
ret double %res
}

define double @test_cosh_undef() {
; CHECK-LABEL: define double @test_cosh_undef() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double undef)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double undef)
ret double %res
}

define double @test_cosh_snan() {
; CHECK-LABEL: define double @test_cosh_snan() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double 0x7FF0000000000001)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double 0x7ff0000000000001)
ret double %res
}

define double @test_cosh_qnan() {
; CHECK-LABEL: define double @test_cosh_qnan() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double 0x7FF8000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double 0x7ff8000000000000)
ret double %res
}

define double @test_cosh_pos_inf() {
; CHECK-LABEL: define double @test_cosh_pos_inf() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double 0x7FF0000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double 0x7ff0000000000000)
ret double %res
}

define double @test_cosh_neg_inf() {
; CHECK-LABEL: define double @test_cosh_neg_inf() {
; CHECK-NEXT: [[RES:%.*]] = call double @llvm.cosh.f64(double 0xFFF0000000000000)
; CHECK-NEXT: ret double [[RES]]
;
%res = call double @llvm.cosh.f64(double 0xfff0000000000000)
ret double %res
}
Loading