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

            Bug ID: 116716
           Summary: gcc.c-torture/execute/pr52286.c seems broken on 16-bit
                    targets
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: testsuite
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mikpelinux at gmail dot com
  Target Milestone: ---

The pr52286.c test case does the following on 16-bit targets:

  long a, b;
  asm ("" : "=r" (a) : "0" (0));
  b = (~a | 1) & -2038094497L;
  if (b >= 0)
    abort ();

On xstormy16 (16-bit int/void*, 32-bit long) the code for this at -Os becomes:

main:
        mov.w r2,#0
        mov r6,r2
        bge r7,r2,.L2
        callf abort
.L2:
        ret

which uses r7 (apparently the high half of the register pair holding a) without
ever initializing it.  Similar use of an uninitialized register is seen on the
pdp11.

If we explicitly mark the input as a long:

-  asm ("" : "=r" (a) : "0" (0));
+  asm ("" : "=r" (a) : "0" (0L));

the code instead becomes the more reasonable:

main:
        mov.w r6,#0
        mov.w r7,#0
        bge r7,#0,.L2
        callf abort
.L2:
        mov.w r2,#0
        ret

I noticed this when debugging an out-of-tree port to target with 16-bit
int/void* and 32-bit long.

Reply via email to