This is a continuation of adding FMF to call instructions:
http://reviews.llvm.org/rL255555
The intent of the patch is to preserve the current behavior of the transform except that we use the sqrt instruction's 'fast' attribute as a trigger rather than the function-level attribute.
But this raises a possible bug noted by the new FIXME comment.
I think that in order to do this transform:
sqrt((x * x) * y) ---> fabs(x) * sqrt(y)
...we need all of the sqrt, the first fmul, and the second fmul to be 'fast'. If any of those ops is strict, we should bail out. Thoughts?
I think you're correct that if any of the ops is strict we should bail out, and your code is fine. Have you checked by any chance what GCC does? Steven Canon might have some more opinions on this.