http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35545
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Main issue seems to be that VRP messes up on: # ap_2 = PHI <ap_8(5)> # prephitmp_14 = PHI <&MEM[(void *)&_ZTV1A + 16B](5)> _19 = *prephitmp_14; here it somehow won't constant propagate the load. Index: passes.def =================================================================== --- passes.def (revision 206040) +++ passes.def (working copy) @@ -236,6 +236,7 @@ along with GCC; see the file COPYING3. NEXT_PASS (pass_reassoc); NEXT_PASS (pass_strength_reduction); NEXT_PASS (pass_dominator); + NEXT_PASS (pass_tracer); /* The only const/copy propagation opportunities left after DOM should be due to degenerate PHI nodes. So rather than run the full propagators, run a specialized pass which @@ -244,7 +245,6 @@ along with GCC; see the file COPYING3. NEXT_PASS (pass_phi_only_cprop); NEXT_PASS (pass_vrp); NEXT_PASS (pass_cd_dce); - NEXT_PASS (pass_tracer); NEXT_PASS (pass_dse); NEXT_PASS (pass_forwprop); NEXT_PASS (pass_phiopt); actually helps since phi_only_cprop is good on this transform. I do not quite gather why VRP can't do it itself. I sent first patch to http://gcc.gnu.org/ml/gcc-patches/2013-12/msg01517.html