[InstCombine] Fold select of ordered fcmps of fabs over NaN-scrubber selects to a single select (#192182)
Fold `select (fcmp <ordered> (fabs (select isKnownNeverNaN X, X, Y)),
K), ...` into a single compare/select directly on `X`. The outer fcmp is
limited to ordered predicates, since only they preserve the original
non-NaN behavior.
fixes #143649
alive2: https://alive2.llvm.org/ce/z/G8UmjY
Generalized proof (needs local alive2 build):
```alive2
declare double @llvm.fabs.f64(double)
define double @src(double %x, double %y, double %k) {
entry:
%ord = fcmp ord double %x, 0.000000e+00
%s = select i1 %ord, double %x, double %y
%a = call double @llvm.fabs.f64(double %s)
%c = fcmp one double %a, %k
%r = select i1 %c, double %s, double %y
ret double %r
}
define double @tgt(double %x, double %y, double %k) {
entry:
%a2 = call double @llvm.fabs.f64(double %x)
%c2 = fcmp one double %a2, %k
%r2 = select i1 %c2, double %x, double %y
ret double %r2
}
```