Skip to content

Commit faa1c45

Browse files
Rules for tan (rust-lang#793)
1 parent 35be55c commit faa1c45

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

enzyme/Enzyme/InstructionDerivatives.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ def : CallPattern<(Op $x),
107107
["exp10"],
108108
[(FMul (FMul (DiffeRet<"">), (Call<(SameFunc), [ReadNone,NoUnwind]> $x) ), (ConstantFP<"2.30258509299404568401799145468"> $x))]
109109
>;
110+
def : CallPattern<(Op $x),
111+
["tan", "tanf", "tanl"],
112+
[(FMul (DiffeRet<"">), (FAdd (ConstantFP<"1.0"> $x), (FMul(Call<(SameFunc), [ReadNone,NoUnwind]> $x):$c, $c)))]>;
110113

111114
// TODO replace with intrinsic call to exp
112115
def : CallPattern<(Op $x),

enzyme/test/Enzyme/ForwardMode/tan.ll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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 @tan(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_fwddiff(double (double)* nonnull @tester, double %x, double 1.0)
13+
ret double %0
14+
}
15+
16+
; Function Attrs: nounwind readnone speculatable
17+
declare double @tan(double)
18+
19+
; Function Attrs: nounwind
20+
declare double @__enzyme_fwddiff(double (double)*, ...)
21+
22+
; CHECK: define internal double @fwddiffetester(double %x, double %"x'")
23+
; CHECK-NEXT: entry:
24+
; CHECK-NEXT: %0 = call fast double @tan(double %x)
25+
; CHECK-NEXT: %1 = fmul fast double %0, %0
26+
; CHECK-NEXT: %2 = fadd fast double 1.000000e+00, %1
27+
; CHECK-NEXT: %3 = fmul fast double %"x'", %2
28+
; CHECK-NEXT: ret double %3
29+
; CHECK-NEXT: }

enzyme/test/Enzyme/ReverseMode/tan.ll

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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 @tan(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 @tan(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 = call fast double @tan(double %x)
25+
; CHECK-NEXT: %1 = fmul fast double %0, %0
26+
; CHECK-NEXT: %2 = fadd fast double 1.000000e+00, %1
27+
; CHECK-NEXT: %3 = fmul fast double %differeturn, %2
28+
; CHECK-NEXT: %4 = insertvalue { double } undef, double %3, 0
29+
; CHECK-NEXT: ret { double } %4
30+
; CHECK-NEXT: }

0 commit comments

Comments
 (0)