You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Make various core math functions easier for the compiler to reason about (#43907)
* ldexp: Break inference loop
We have an inference loop fma_emulated -> ldexp -> ^(::Float64, ::Int) -> fma -> fma_emulated.
The arguments to `^` are constant, so constprop will figure it out, but it does require a bunch
of extra processing. There is a simpler way to write this using elementary bit operations.
Since resolving the inference loop requires constprop, this was breaking #43852. That is
fixable, but I think we should also make this change to avoid having an unnecessary inference
loop in our basic math functions, which will make future analyses easier.
* Make fma_emulated easier for the compiler to reason about
The fact that the `exponent` call in `fma_emulated` requires reasoning
about the ranges of the floating point values in question, which the
compiler is not capable of doing (and is unlikely to ever do automatically).
Thus, in order for the compiler to know that `fma_emulated` (and
by extension `fma`) is :nothrow in a post-#43852 world, create a
separate version of the `exponent` function that assumes its precondition.
We could use `@assume_effects` instead, but this version is currently
slightly easier on the compiler.
* pow: Make integer vs float branch obvious to constprop
The integer branch is nothrow, so if the caller does something like
`^(x::Float64, 2.0)`, we'd like to discover that.
0 commit comments