blob: 47c965bb7f2af71e765352bfca2ba43c725d45f7 [file] [log] [blame] [edit]
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O0 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O1 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O2 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O3 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
// RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi
#include "../test_utils.h"
#include <vector>
#include <enzyme/enzyme>
using Flt = double;
using Vec = std::vector<Flt>;
Flt sum(const Vec& x) {
Flt ret = 0.0;
for (const auto xi : x) ret += xi;
return ret;
} // <-- sum
Vec dsum(const Vec& x) {
Vec dx(x.size());
enzyme::autodiff<enzyme::Reverse>(
sum,
enzyme::DuplicatedNoNeed<const Vec&>{ x, dx }
);
return dx;
} // <-- dsum
int main() {
const Vec x{ 3, 42, 451 };
const auto df = dsum(x);
TEST_EQ(df.size(), 3);
APPROX_EQ(df[0], 1, 1e-10);
APPROX_EQ(df[1], 1, 1e-10);
APPROX_EQ(df[2], 1, 1e-10);
return 0;
}