| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-loose-types -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -enzyme-loose-types -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli - | |
| // RUN: %clang++ -std=c++11 -fno-exceptions -ffast-math -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli - | |
| #include <stdio.h> | |
| #include "../test_utils.h" | |
| #include <stdio.h> | |
| #include <map> | |
| #include <unordered_map> | |
| #include <string> | |
| using dictSU = std::unordered_map<std::string, double>; | |
| using dictCU = std::unordered_map<const char*, double>; | |
| using dictSO = std::map<std::string, double>; | |
| using dictCO = std::map<const char*, double>; | |
| template<typename T> | |
| extern void __enzyme_autodiff(void*, int, T&, T&); | |
| template<typename dict> | |
| void square(dict& vals) { | |
| vals["x"] = vals["x"] * vals["x"]; | |
| } | |
| template<typename dict> | |
| void dsquare() { | |
| dict vals; | |
| vals["x"] = 3.0; | |
| dict dvals; | |
| dvals["x"] = 1.0; | |
| __enzyme_autodiff((void*)square<dict>, enzyme_dup, vals, dvals); | |
| printf("%f\n", dvals["x"]); | |
| APPROX_EQ(dvals["x"], 6.0, 1e-7); | |
| } | |
| int main() { | |
| dsquare<dictSU>(); | |
| dsquare<dictCU>(); | |
| // dsquare<dictSO>(); | |
| // dsquare<dictCO>(); | |
| } | |