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

            Bug ID: 118511
           Summary: [15 Regression] ICE when compiling s390-tools since
                    r15-2002
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

s390-tools stage3.c has
static inline void __attribute__((noreturn)) start_kernel(void)
{
 struct psw_t *psw = &(*((struct _lowcore *) 0)).program_new_psw;
 unsigned long addr, code;

 psw->mask = 0x000000180000000ULL;
 code = 1;

 asm volatile(

  "       larl    %[addr],.no_diag308\n"
  "       stg     %[addr],8(%[psw])\n"
  "       diag    %[code],%[code],0x308\n"
  ".no_diag308:\n"
  "       sam31\n"
  "       sr      %r1,%r1\n"
  "       sr      %r2,%r2\n"
  "       sigp    %r1,%r2,%[order]\n"
  "       lpsw    0\n"
  : [addr] "=&d" (addr),
    [code] "+&d" (code)
  : [psw] "a" (psw),
    [order] "L" (18));
 while (1);
}

It is unclear what they intended, it assembled before r15-2002 with %r1 the
same as %[code] (or %1, same thing) and %r2 the same as %[psw] (or %2, same
thing), the r modifier was just ignored.
They could have meant %%r1 and %%r2 too, who knows.
With --enable-checking=release gcc 15 it just emits something which doesn't
assemble.

In any case, print_operand hooks shouldn't be using assertions, they should be
using
output_operand_lossage.

Reply via email to