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