]> gcc.gnu.org Git - gcc.git/commit
match.pd: Don't fold nan < x etc. for -ftrapping-math [PR106805]
authorJakub Jelinek <jakub@redhat.com>
Mon, 5 Dec 2022 10:54:45 +0000 (11:54 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 5 Dec 2022 10:54:45 +0000 (11:54 +0100)
commit109148dd16e4bcd50faee19c49082de69d0ba26e
tree9975835a5d714fb823b32abb3739c4daee73ec49
parent4500baaccb6e4d696e223c338bbdf7705c3646dd
match.pd: Don't fold nan < x etc. for -ftrapping-math [PR106805]

As reported in the PR, the following pr106805.c testcase is miscompiled
with the default -ftrapping-math, because we fold all the comparisons into
constants and don't raise any exceptions.

The match.pd pattern handles just simple comparisons, from those
EQ/NE are quiet and don't raise exceptions on anything but sNaN, while
GT/GE/LT/LE are signaling and do raise exceptions even on qNaN.

fold_relational_const handles this IMHO correctly:
      /* Handle the cases where either operand is a NaN.  */
      if (real_isnan (c0) || real_isnan (c1))
        {
          switch (code)
            {
            case EQ_EXPR:
            case ORDERED_EXPR:
              result = 0;
              break;

            case NE_EXPR:
            case UNORDERED_EXPR:
            case UNLT_EXPR:
            case UNLE_EXPR:
            case UNGT_EXPR:
            case UNGE_EXPR:
            case UNEQ_EXPR:
              result = 1;
              break;

            case LT_EXPR:
            case LE_EXPR:
            case GT_EXPR:
            case GE_EXPR:
            case LTGT_EXPR:
              if (flag_trapping_math)
                return NULL_TREE;
              result = 0;
              break;

            default:
              gcc_unreachable ();
            }

          return constant_boolean_node (result, type);
        }
by folding the signaling comparisons only if -fno-trapping-math.
The following patch does the same in match.pd.

Unfortunately the pr106805.c testcase still fails, but no longer because of
match.pd, but on the trunk because of the still unresolved ranger problems
(same issue as for fold-overflow-1.c etc.) and on 12 branch (and presumably
trunk too) somewhere during expansion the comparisons are also expanded
into constants (which is ok for -fno-trapping-math, but not ok with that).

Though, I think the patch is a small step in the direction, so I'd like
to commit this patch without the gcc.dg/pr106805.c testcase for now.

2022-12-05  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/106805
* match.pd (cmp @0 REAL_CST@1): Don't optimize x cmp NaN
or NaN cmp x to false/true for cmp >/>=/</<= if -ftrapping-math.

* c-c++-common/pr57371-4.c: Revert 2021-09-19 changes.
* c-c++-common/pr57371-5.c: New test.
* gcc.c-torture/execute/ieee/fp-cmp-6.x: Add -fno-trapping-math.
* gcc.c-torture/execute/ieee/fp-cmp-9.c: New test.
* gcc.c-torture/execute/ieee/fp-cmp-9.x: New file.
gcc/match.pd
gcc/testsuite/c-c++-common/pr57371-4.c
gcc/testsuite/c-c++-common/pr57371-5.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-6.x
gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-9.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-9.x [new file with mode: 0644]
This page took 0.056 seconds and 5 git commands to generate.