Skip to content

Commit fd0d928

Browse files
authored
Add sinc normalized (rust-lang#834)
1 parent 5d967a5 commit fd0d928

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

enzyme/Enzyme/InstructionDerivatives.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ def : CallPattern<(Op $x),
143143
[(FMul (Intrinsic<"exp", [(TypeOf<""> $x)]> $x), (DiffeRet<"">))]
144144
>;
145145

146+
// Unnormalized sinc(x) = sin(x)/x
146147
def : CallPattern<(Op $x),
147148
["sinc", "sincf", "sincl"],
148149
[(FMul (DiffeRet<"">), (FDiv (FSub (Intrinsic<"cos", [(TypeOf<""> $x)]> $x), (Call<(SameFunc), [ReadNone,NoUnwind]> $x)), $x))]>;
150+
151+
// Normalized sinc(x) = sin(pi x)/(pi x)
152+
def : CallPattern<(Op $x),
153+
["sincn", "sincnf", "sincnl"],
154+
[(FMul (DiffeRet<"">), (FDiv (FSub (Intrinsic<"cos", [(TypeOf<""> $x)]> (FMul (ConstantFP<"3.1415926535897962684626433"> $x), $x)), (Call<(SameFunc), [ReadNone,NoUnwind]> $x)), $x))]>;

enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ llvm::cl::opt<bool> EnzymeStrictAliasing(
7474

7575
const std::map<std::string, llvm::Intrinsic::ID> LIBM_FUNCTIONS = {
7676
{"sinc", Intrinsic::not_intrinsic},
77+
{"sincn", Intrinsic::not_intrinsic},
7778
{"cos", Intrinsic::cos},
7879
{"sin", Intrinsic::sin},
7980
{"tan", Intrinsic::not_intrinsic},
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: %opt < %s %loadEnzyme -enzyme -enzyme-preopt=false -mem2reg -instsimplify -simplifycfg -S | FileCheck %s
2+
3+
; Function Attrs: nounwind readnone uwtable
4+
define double @tester(double %x) {
5+
entry:
6+
%0 = tail call fast double @sincn(double %x)
7+
ret double %0
8+
}
9+
10+
define double @test_derivative(double %x) {
11+
entry:
12+
%0 = tail call double (double (double)*, ...) @__enzyme_autodiff(double (double)* nonnull @tester, double %x)
13+
ret double %0
14+
}
15+
16+
; Function Attrs: nounwind readnone speculatable
17+
declare double @sincn(double)
18+
19+
; Function Attrs: nounwind
20+
declare double @__enzyme_autodiff(double (double)*, ...)
21+
22+
; CHECK: define internal { double } @diffetester(double %x, double %differeturn)
23+
; CHECK-NEXT: entry:
24+
; CHECK-NEXT: %0 = fmul fast double 0x400921FB54442D1F, %x
25+
; CHECK-NEXT: %[[i0:.+]] = call fast double @llvm.cos.f64(double %0)
26+
; CHECK-NEXT: %[[i1:.+]] = call fast double @sincn(double %x)
27+
; CHECK-NEXT: %[[i2:.+]] = fsub fast double %[[i0]], %[[i1]]
28+
; CHECK-NEXT: %[[i3:.+]] = fdiv fast double %[[i2]], %x
29+
; CHECK-NEXT: %[[i4:.+]] = fmul fast double %differeturn, %[[i3]]
30+
; CHECK-NEXT: %[[i5:.+]] = insertvalue { double } undef, double %[[i4]], 0
31+
; CHECK-NEXT: ret { double } %[[i5]]
32+
; CHECK-NEXT: }

0 commit comments

Comments
 (0)