https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79578
Jeffrey A. Law <law at redhat dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |law at redhat dot com --- Comment #5 from Jeffrey A. Law <law at redhat dot com> --- So at the first DSE pass the IL looks like: ;; basic block 2, loop depth 0 ;; pred: ENTRY if (b_3(D) != 0B) goto <bb 3>; [0.00%] else goto <bb 4>; [0.00%] ;; succ: 3 ;; 4 ;; basic block 3, loop depth 0 ;; pred: 2 # .MEM_9 = VDEF <.MEM_5(D)> MEM[(struct A *)b_3(D)] = {}; ;; succ: 4 ;; basic block 4, loop depth 0 ;; pred: 3 ;; 2 # .MEM_2 = PHI <.MEM_9(3), .MEM_5(D)(2)> # .MEM_12 = VDEF <.MEM_2> MEM[(struct A *)b_3(D)].a = 1; # .MEM_13 = VDEF <.MEM_12> MEM[(struct A *)b_3(D)].b = 2; # VUSE <.MEM_13> return b_3(D); ;; succ: EXIT The initialization looks like a fully dead store to me. And it is. The reason it's not caught is we currently require pointer equality on the address expression. Using operand_equal_p instead results in the initialization being eliminated by DSE1. I think the only question is whether or not to fix this during stage4 or wait for gcc-8. It's a 1-liner ;-) Of course once the dead store is gone BB3 is pointless and we can eliminate the test resulting in: movq %rdi, %rax movl $131073, (%rdi) ret