This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/42893] New: [4.3/4.4/4.5 Regression] Missed conditionally dead store elimination


Taken from
http://embed.cs.utah.edu/embarrassing/jan_10/harvest/source/8A/8AB0B238.shtml:

struct frame_info;
void tui_registers_changed_hook (void);
extern struct frame_info *deprecated_selected_frame;
int tui_refreshing_registers = 0;
void
tui_registers_changed_hook (void)
{
  struct frame_info *fi;

  fi = deprecated_selected_frame;
  if (fi)
    {
      if (tui_refreshing_registers == 0)
        {
          tui_refreshing_registers = 1;
          tui_refreshing_registers = 0;
        }
    }
  return;
}



Assembler output from GCC 3.4.6 at -O3 on x86_64:

.globl tui_registers_changed_hook
        .type   tui_registers_changed_hook, @function
tui_registers_changed_hook:
.LFB2:
        rep ; ret
.LFE2:
        .size   tui_registers_changed_hook, .-tui_registers_changed_hook



Assembler output from GCC 4.5.0 (r155776) at -O3 on x86_64:

.globl tui_registers_changed_hook
        .type   tui_registers_changed_hook, @function
tui_registers_changed_hook:
.LFB0:
        .cfi_startproc
        cmpq    $0, deprecated_selected_frame(%rip)
        je      .L1
        movl    tui_refreshing_registers(%rip), %eax
        testl   %eax, %eax
        jne     .L1
        movl    $0, tui_refreshing_registers(%rip)
.L1:
        rep
        ret
        .cfi_endproc
.LFE0:
        .size   tui_registers_changed_hook, .-tui_registers_changed_hook


This also confuses the tree optimizers (e.g. GCC now fails to note that the
function is pure+const). The .optimized dump:

;; Function tui_registers_changed_hook (tui_registers_changed_hook)

tui_registers_changed_hook ()
{
  struct frame_info * fi;
  int tui_refreshing_registers.0;

<bb 2>:
  fi_1 = deprecated_selected_frame;
  if (fi_1 != 0B)
    goto <bb 3>;
  else
    goto <bb 5>;

<bb 3>:
  tui_refreshing_registers.0_2 = tui_refreshing_registers;
  if (tui_refreshing_registers.0_2 == 0)
    goto <bb 4>;
  else
    goto <bb 5>;

<bb 4>:
  tui_refreshing_registers = 0;

<bb 5>:
  return;

}


-- 
           Summary: [4.3/4.4/4.5 Regression] Missed conditionally dead store
                    elimination
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steven at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42893


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]