blob: 4d41f2bf482ad5de6be49d37a3e12056472dc872 [file] [log] [blame] [edit]
// RUN: %clang -std=c11 -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
#include "../test_utils.h"
void __enzyme_autodiff(void*, ...);
void alldiv(double* a, int N) {
for (int i=0; i<=N; i++) {
a[i] *= a[i];
}
}
int main(int argc, char** argv) {
double* a1 = malloc(sizeof(double));
double* a10 = malloc(10*sizeof(double));
alldiv((double*)0, -1);
alldiv((double*)0, -10);
alldiv(a1, 0);
alldiv(a10, 9);
//omp(*a, N);
printf("ran orig\n");
fflush(0);
double* d_a1 = malloc(sizeof(double));
double* d_a10 = malloc(10*sizeof(double));
__enzyme_autodiff((void*)alldiv, (double*)0, (double*)0, -1);
__enzyme_autodiff((void*)alldiv, (double*)0, (double*)0, -10);
a1[0] = 3.14;
d_a1[0] = 1.0;
__enzyme_autodiff((void*)alldiv, (double*)a1, (double*)d_a1, 0);
printf("a1[0]=%f d_a1[0]=%e\n", a1[0], d_a1[0]);
fflush(0);
APPROX_EQ(a1[0], 3.14*3.14, 1e-10);
APPROX_EQ(d_a1[0], 6.28, 1e-10);
for (int i=0; i<10; i++) {
a10[i] = 1+i;
d_a10[i] = 1;
}
__enzyme_autodiff((void*)alldiv, (double*)a10, (double*)d_a10, 9);
for(int i=0; i<10; i++) {
printf("a10[%d]=%f d_a10[%d]=%e\n", i, a10[i], i, d_a10[i]);
}
fflush(0);
for(int i=0; i<10; i++) {
APPROX_EQ(d_a10[i], 2.0 * (1+i), 1e-10);
}
return 0;
}