No, but if the backend does, that should not be disturbed (as it is the “best” solution).
We basically want to have the following flow:
- llvm.math flows in (or is created at some point) which is understood by the optimizer
- libm comes in that implements llvm.math (via attributes)
- backends report what intrinsics they support natively
- a pass in the middle end replaces llvm.math with libm calls
- inliner and IPO have a chance to optimize the call sites