1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// RUN: if [ %llvmver -ge 12 ]; then ls && %clang -std=c11 -O0 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O1 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O2 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O3 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O0 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O1 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O2 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O3 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang -std=c11 -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi
#include "../test_utils.h"
double pow(double, double);
__attribute__((noinline))
unsigned long long factorial(unsigned long long x) {
if (x == 0) return 1;
return x * factorial(x-1);
}
double my_sin(double x) {
double result = 0;
unsigned long long N = 12;
for(unsigned long long i=0; i<=N; i++) {
if (i % 2 == 0) continue;
result += pow(x, i) / factorial(i) * (i % 4 == 1 ? 1 : -1);
}
return result;
}
unsigned long long __enzyme_iter(unsigned long long, unsigned long long);
double __enzyme_autodiff(void*, double);
double my_sin2(double x) {
double result = 0;
unsigned long long N = __enzyme_iter(12, 1);
for(unsigned long long i=0; i<=N; i++) {
if (i % 2 == 0) continue;
result += pow(x, i) / factorial(i) * (i % 4 == 1 ? 1 : -1);
}
return result;
}
double d_mysin2(double x) {
return __enzyme_autodiff(my_sin2, x);
}
double dd_mysin2(double x) {
return __enzyme_autodiff(d_mysin2, x);
}
double ddd_mysin2(double x) {
return __enzyme_autodiff(dd_mysin2, x);
}
double dddd_mysin2(double x) {
return __enzyme_autodiff(ddd_mysin2, x);
}
int main() {
double x = 1.23;
printf("my_sin(x=%f)=%e\n", x, my_sin(x));
printf("my_sin2(x=%f)=%e\n", x, my_sin2(x));
APPROX_EQ(my_sin2(x), my_sin(x), 10e-10);
printf("dd_my_sin2(x=%f)=%e\n", x, dd_mysin2(x));
APPROX_EQ(dd_mysin2(x), -my_sin(x), 10e-10);
printf("dddd_my_sin2(x=%f)=%e\n", x, dddd_mysin2(x));
APPROX_EQ(dddd_mysin2(x), my_sin(x), 10e-10);
}