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

            Bug ID: 117359
           Summary: Stack pointer modifications in asm are not flagged in
                    crtl->sp_is_unchanging
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ubizjak at gmail dot com
  Target Milestone: ---

Consider the following testcase, derived from x86 linux sources:

--cut here--
register unsigned long current_stack_pointer asm ("sp");
#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)

void foo (void)
{
  asm volatile ("#" : ASM_CALL_CONSTRAINT);
}
--cut here--

The asm writes to stack pointer, as can be seen from _.final dump:

(insn:TI 5 2 15 2 (parallel [
            (set (reg/v:DI 7 sp [ current_stack_pointer ])
                (asm_operands/v:DI ("#") ("=r") 0 [
                        (reg/v:DI 7 sp [ current_stack_pointer ])
                    ]
                     [
                        (asm_input:DI ("0") rsp.c:6)
                    ]
                     [] rsp.c:6))
            (clobber (reg:CC 17 flags))
        ]) "rsp.c":6:3 -1
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))

but middle-end fails to detect this write. This issue can be observed by
putting a breakpoint at ix86_compute_frame_layout and:

Breakpoint 2, ix86_compute_frame_layout () at
../../git/gcc/gcc/config/i386/i386.cc:6876
6876      struct ix86_frame *frame = &cfun->machine->frame;
(gdb) p x_rtl->sp_is_unchanging 
$1 = true

The above result should be false.

Reply via email to