blob: 4b917e7e282f86a1df09428bca7c419f1df99060 [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 <stdint.h>
#include <math.h>
#include <stdio.h>
#include "../test_utils.h"
double f(double x) {
int exp;
return frexp(x, &exp);
}
double __enzyme_autodiff(void*, ...);
int main() {
double data[] = { 0.9, 1.0, 1.2, 2.0, 2.3, 32.0, 33.0, 0.25, 0.26, -0.9, -1.0, -1.2, -2.0, -2.3, 32.0, -33.0};
for (int i=0; i<sizeof(data)/sizeof(*data); i++) {
double truev = f(data[i])/data[i];
double ad = __enzyme_autodiff((void*)f, data[i]);
printf("x=%f f(x)=%f f/x=%f, d/dx=%f\n", data[i], f(data[i]), truev, ad);
APPROX_EQ(ad, truev, 1e-10);
}
}