https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77647
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |law at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Known to work| |5.4.0 Target Milestone|--- |6.3 Summary|Missed opportunity to use |[6/7 Regression] Missed |register value causes |opportunity to use register |additional load |value causes additional | |load --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- DOM doesn't propagate the equivalence on the not unreachable edge, that is, it doesn't copy-propagate because of PR71947 if (ret_3 != _5) goto <bb 3>; else goto <bb 4>; <bb 3>: __builtin_unreachable (); <bb 4>: _4 = ret_3 + _5; DOM does the following after Jeffs patch: Optimizing block #4 1>>> STMT 1 = ret_3 le_expr _5 1>>> STMT 1 = ret_3 ge_expr _5 1>>> STMT 1 = ret_3 eq_expr _5 1>>> STMT 0 = ret_3 ne_expr _5 0>>> COPY ret_3 = _5 0>>> COPY _5 = ret_3 Optimizing statement _4 = ret_3 + _5; Replaced 'ret_3' with variable '_5' Replaced '_5' with variable 'ret_3' Folded to: _4 = ret_3 + _5; which is of course a quite stupid replacement. I still believe the change should be reverted ... Jeff, are you still investigating this? Works on the GCC 5 branch: Optimizing block #4 0>>> COPY _5 = ret_3 1>>> STMT 1 = ret_3 le_expr _5 1>>> STMT 1 = ret_3 ge_expr _5 1>>> STMT 1 = ret_3 eq_expr _5 1>>> STMT 0 = ret_3 ne_expr _5 Optimizing statement _4 = ret_3 + _5; Replaced '_5' with variable 'ret_3' LKUP STMT _4 = ret_3 plus_expr ret_3 2>>> STMT _4 = ret_3 plus_expr ret_3 with assembly foo: .LFB1: .cfi_startproc #APP # 4 "t.c" 1 movq (%rdi),%rax # 0 "" 2 #NO_APP addq %rax, %rax ret