Files
Kiva 6446435534 [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
}
```
2026-04-29 19:23:55 +08:00
..