[Bug rtl-optimization/83162] [6/7/8 Regression] x86-64 -Wclobbered issuing more false alarms (regression)

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Nov 27 08:49:00 GMT 2017


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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic, ra
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org
          Component|c                           |rtl-optimization
      Known to work|                            |4.8.5
   Target Milestone|---                         |7.3
            Summary|x86-64 -Wclobbered issuing  |[6/7/8 Regression] x86-64
                   |more false alarms           |-Wclobbered issuing more
                   |(regression)                |false alarms (regression)

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Hm, so the warning just does

static void
setjmp_args_warning (bitmap setjmp_crosses)
{
  tree decl;
  for (decl = DECL_ARGUMENTS (current_function_decl);
       decl; decl = DECL_CHAIN (decl))
    if (DECL_RTL (decl) != 0
        && REG_P (DECL_RTL (decl))
        && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
      warning (OPT_Wclobbered,
               "argument %q+D might be clobbered by %<longjmp%> or %<vfork%>",
               decl);

and thus looks whether the PARM_DECL is expanded as a register and is
regno_clobbered_at_setjmp.  But it seems to fail to exclude call clobbered
registers as we can see we spill those regs:

module_vec_set:
.LFB0:
        .cfi_startproc
        subq    $40, %rsp
        .cfi_def_cfa_offset 48
        movq    %rdi, 8(%rsp)
        movl    $jb, %edi
        movq    %rsi, 16(%rsp)
        movq    %rdx, 24(%rsp)
        call    _setjmp
        testl   %eax, %eax
        jne     .L1
        xorl    %eax, %eax
        cmpb    $0, module_assertions(%rip)
        movq    24(%rsp), %rcx
        movq    16(%rsp), %rsi
...

/* True if register REGNO was alive at a place where `setjmp' was
   called and was set more than once or is an argument.  Such regs may
   be clobbered by `longjmp'.  */

static bool
regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)

I don't really understand what this is about.  At least call clobbered
regs should get spilled so this should be about callee saved ones only?


More information about the Gcc-bugs mailing list