| // RUN: if [ %llvmver -ge 12 ]; then %clang -O0 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O1 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O2 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O3 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O0 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O1 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O2 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O3 %s -S -emit-llvm -o - %loadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme -mllvm -enzyme-inline=1 -S | %lli - ; fi | |
| #include <stdio.h> | |
| #include <math.h> | |
| #include <vector> | |
| #include "../test_utils.h" | |
| #include <stdio.h> | |
| #define DIM 3 | |
| void __enzyme_autodiff(void*, ...); | |
| double symmetry_function_atomic(double const *coords) { | |
| double res = 0; | |
| for (int jj = 0; jj < 2; ++jj) | |
| { | |
| // Compute rij | |
| double rij[DIM]; | |
| double v = coords[jj]; | |
| for (int dim = 0; dim < DIM; ++dim) { | |
| rij[dim] = v; | |
| } | |
| res += rij[0] * rij[0]; | |
| } | |
| return res; | |
| } | |
| __attribute__((noinline)) | |
| void f(double* coords, double* forces) { | |
| __enzyme_autodiff((void*)symmetry_function_atomic, | |
| coords, forces); | |
| } | |
| int main() { | |
| double coords[2] = {3.0, 5.0}; | |
| double forces[2] = {0.0, 0.0}; | |
| f(coords, forces); | |
| printf("%f\n", forces[0]); | |
| printf("%f\n", forces[1]); | |
| APPROX_EQ(forces[0], 6.0, 1e-10); | |
| APPROX_EQ(forces[1], 10.0, 1e-10); | |
| return 0; | |
| } |