https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91425

            Bug ID: 91425
           Summary: Ordered compares aren't optimised properly
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: segher at gcc dot gnu.org
  Target Milestone: ---

Take this example:

===
#include <math.h>

_Bool lt(double a, double b) { return isless(a, b); }
_Bool lo(double a, double b) { return a < b; }
_Bool ll(double a, double b) { return lt(a,b) || lo(a,b); }
_Bool lx(double a, double b) { return lo(a,b) || lt(a,b); }
===

"lt" is an "unordered" comparison, that is, it does not raise an
exception if one (or both) of the inputs is a NaN, i.e. if the
comparison result is "unordered".  "lo" is an "ordered" comparison,
which means it does raise an exception if one of the inputs is a
NaN.

Doing both is the same as just doing the ordered comparison and
using the result for both.  "ll" should compile to the same as "lx"
does, and that should be the same as what is generated for "lo".

But it is not; not on rs6000 (with my cmpo patches), and not on x86
either: in both cases all three are different.  And in fact the
gimple output for all three is different; I think we need to fix
that before making RTL and the targets behave better.

Reply via email to