I couldn't find much from LLVM, but I found a more detailed explanation from the GCC docs.
Aliases, especially weak aliases, can be used to define default implementations of certain functions when the system headers don't define it.
This question shows an example of its usage in the Linux glibc source.
Judging by this example, ifunc could be useful for when you want to select a different version of some function optimized for certain processors.
The resolver function you write could use some OS-specific code to determine certain system characteristics (like the processor type) and return a pointer to the correct function.
Most of this is really low level stuff, so I'm 99% sure that you don't need to use them in a language front end.