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

            Bug ID: 118446
           Summary: __builtin_iseqsig does not raise exception when
                    supplied with NaN on Cortex-M at -O1 or higher
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: azoff at gcc dot gnu.org
  Target Milestone: ---

Consider the following function (extracted from
gcc.dg/torture/builtin-iseqsig-1.c):

#include <fenv.h>
void
ffalse (float x, float y)
{
  if (__builtin_iseqsig (x, y))
    __builtin_abort ();
}

The combine step, for the above snippet, incorrectly selects cmpsf_vfp instead
of cmpsf_trap_vfp at -O1 or higher. As a consequence, no exception is raised
when one of the input values are NaN.

Snippet from foo.c.302r.combine:

Trying 7 -> 11:
    7: cc:CCFPE=cmp(r117:SF,r118:SF)
   11: cc:CCFPE=cc:CCFPE
Successfully matched this instruction:
(set (reg:CCFP 100 cc)
    (compare:CCFP (reg/v:SF 117 [ x ])
        (reg/v:SF 118 [ y ])))
Successfully matched this instruction:
(set (pc)
    (if_then_else (unlt (reg:CCFP 100 cc)
            (const_int 0 [0]))
        (label_ref:SI 24)
        (pc)))
allowing combination of insns 7 and 11
original costs 4 + 2 = 22
replacement cost 20
deferring deletion of insn with uid = 7.
modifying other_insn    12: pc={(unlt(cc:CCFP,0))?L24:pc}
      REG_DEAD cc:CC
      REG_BR_PROB 536870916
deferring rescan insn with uid = 12.
modifying insn i3    11: cc:CCFP=cmp(r117:SF,r118:SF)
deferring rescan insn with uid = 11.


I see the above issue for Cortex-M4/7/33/55/85 with -mfloat-abi=hard.

Example command line to reproduce:

arm-none-eabi-gcc -march=armv7e-m+fp -mfloat-abi=hard -mfpu=auto -O1 -S -o -
foo.c

Reply via email to