blob: acd73ccbe973bca33812ac1bb6109ab1e4daa6f5 [file] [log] [blame] [edit]
// RUN: %clang -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -O1 -g %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
#include "../test_utils.h"
#include <stdio.h>
struct Vector {
double x1, x2, x3, x4;
};
extern Vector __enzyme_batch(...);
extern int enzyme_width;
extern int enzyme_vector;
extern int enzyme_scalar;
double square(double x) { return x * x; }
Vector vecsquare(double x1, double x2, double x3, double x4) {
return __enzyme_batch(square, enzyme_width, 4, enzyme_vector, x1, x2, x3, x4);
}
int main() {
double vals[] = {23.1, 10.0, 100.0, 3.14};
double expected[] = {square(vals[0]), square(vals[1]), square(vals[2]),
square(vals[3])};
Vector result = vecsquare(vals[0], vals[1], vals[2], vals[3]);
APPROX_EQ(result.x1, expected[0], 1e-10);
APPROX_EQ(result.x2, expected[1], 1e-10);
APPROX_EQ(result.x3, expected[2], 1e-10);
APPROX_EQ(result.x4, expected[3], 1e-10);
}