| // 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; |
| } |