intrinsics

Hello,

I would like to find out a detail about intrinsics functions. When I use memset form a standard library it is always converted to llvm’s memset, however the usage of some others as sqrt, pow, sin do not lead to the same. How can I get the same effect?

Why there is no overall LLVM pass like IntrinsicLowerinPass.cpp (it has only some specific ones)? There is only a function that does this.

Hello,
I would like to find out a detail about intrinsics functions. When I use memset form a standard library it is always converted to llvm's memset, however the usage of some others as sqrt, pow, sin do not lead to the same. How can I get the same effect?

For math functions in particular, the intrinsics don't really match the semantics of the actual C library functions, so clang doesn't normally convert them. (If you use -ffast-math, clang will convert them anyway.) This is an area which could probably be improved, but it's complicated because we depend on the host's libm.

Why there is no overall LLVM pass like IntrinsicLowerinPass.cpp (it has only some specific ones)? There is only a function that does this.

Some intrinsics expose functionality which can't be expressed using IR instructions.

-Eli

And are such intrinsics, as memset, memcpy, memmove replaced by standard library calls? This is said in sources, that it looks for such functions in global symbol table.

The backend will sometimes generate a call to the C library memset, memcpy, or memmove to lower a call to the LLVM intrinsics with the same name. Depending on the target/optimization flags/length of the operation, in some cases it will generate inline code, or generate a call to a function with a different name.

great, thank you!

Still, I have tried fast option:
clang -S -O3 -mllvm -ffast-math -emit-llvm sqrt.c -o sqrt.s

and also with specifying this option in opt (not in clang) - it stays the same sqrt.

#include <stdlib.h>

#include <stdio.h>
int main() {

int a;
scanf(“%d”, &a);
double b = sqrt(a);
int c = (b > 10) ? 1 : 0;
return c;
}

“-mllvm -ffast-math” is not a thing; the flag is just “-ffast-math”. (We should probably rename the Hexagon backend option to avoid confusion.) -Eli

Thank you for our answers!

The last thing I would like to know : is I don’t want any llvm intrinsics at all, -fno-builtin option is the right one?