We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
0.0
Issue: I get the following error:
error: Enzyme: Cannot deduce type of memset call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(108) %3, i8 0, i64 108, i1 false) #7 <analysis> ptr %0: {[-1]:Pointer}, intvals: {} ptr %1: {[-1]:Pointer}, intvals: {} ptr %2: {[-1]:Pointer}, intvals: {} ptr %3: {[-1]:Pointer}, intvals: {} </analysis>
in function:
void irreps_to_out(float* x_, float* y_, float* z_, float* out_feature){ float x = *x_; float y = *y_; float z = *z_; float *product = (float*) malloc(27 * sizeof(float)); for(int i = 0; i < 27; i++) { product[i] = 0.0; } // <--- Problematic line for(int i = 0; i < 27; i++) { out_feature[i] = product[i]; } }
Issue is specifically that the compiler optimizes this assignment to a memset call if assigned value is 0.0. For any other assignment like
for(int i = 0; i < 27; i++) { product[i] = 0.0000000000001; } // <--- Problematic line
it compiles fine.
It also compiles if I give option -O0 thus avoiding optimization of assignment to memset.
-O0
memset
Full example:
#include <stdio.h> #include <stdlib.h> #include <math.h> void irreps_to_out(float* x_, float* y_, float* z_, float* out_feature) { float x = *x_; float y = *y_; float z = *z_; // float product[27]; float *product = (float*) malloc(27 * sizeof(float)); for(int i = 0; i < 27; i++) { product[i] = 0.0; } // <--- Problematic line for(int i = 0; i < 27; i++) { out_feature[i] = product[i]; } } int enzyme_dup; void __enzyme_autodiff(void (*) (float*, float*, float*, float*), int, float*, float*, int, float*, float*, int, float*, float*, int, float*, float*); int main(){ float out_feature[27] = { 0., 0., 0.,0., 0., 0.,0., 0., 0., 0., 0., 0.,0., 0., 0.,0., 0., 0., 0., 0., 0.,0., 0., 0.,0., 0., 0. }; float out_grad[27] = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}; float x = 1.0, y = 2.0, z = 3.0; float x_grad = 0.0, y_grad = 0.0, z_grad = 0.0; irreps_to_out(&x, &y, &z, out_feature); __enzyme_autodiff(irreps_to_out, enzyme_dup, &x, &x_grad, enzyme_dup, &y, &y_grad, enzyme_dup, &z, &z_grad, enzyme_dup, out_feature, out_grad); return 0; }
compiled as
clang example.c -Xclang -load -Xclang /path/to/ClangEnzyme-15.so -lm -O3
clang -v clang version 15.0.7 (https://github.com/conda-forge/clangdev-feedstock 7546975a4a926b2b6b05f442d73827ff01b1ae76) Target: x86_64-conda-linux-gnu Thread model: posix InstalledDir: /opt/mambaforge/mambaforge/envs/e3nn/bin Found candidate GCC installation: /opt/mambaforge/mambaforge/envs/e3nn/bin/../lib/gcc/x86_64-conda-linux-gnu/14.1.0 Selected GCC installation: /opt/mambaforge/mambaforge/envs/e3nn/bin/../lib/gcc/x86_64-conda-linux-gnu/14.1.0 Candidate multilib: .;@m64 Selected multilib: .;@m64
Enzyme commit: 192d9231aaa5415fa135ffb3568cc8eceef512d5
192d9231aaa5415fa135ffb3568cc8eceef512d5
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Issue:
I get the following error:
in function:
Issue is specifically that the compiler optimizes this assignment to a memset call if assigned value is 0.0. For any other assignment like
it compiles fine.
It also compiles if I give option
-O0
thus avoiding optimization of assignment tomemset
.Enzyme Explorer:
https://fwd.gymni.ch/ecQeCs
Full example:
compiled as
Enzyme commit:
192d9231aaa5415fa135ffb3568cc8eceef512d5
The text was updated successfully, but these errors were encountered: