http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> 2013-02-11 10:52:39 UTC --- One of the reasons this all happens is of course that after complete unrolling we miss a pass that does full redundancy removal and const/copy propagation. For the latter we abuse VRP (but cripple it), for the former we have DOM, but that is scheduled after VRP. I wonder if we should simply move VRP after DOM. Like with Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 195938) +++ gcc/passes.c (working copy) @@ -1488,7 +1488,6 @@ init_optimization_passes (void) NEXT_PASS (pass_lower_vector_ssa); NEXT_PASS (pass_cse_reciprocals); NEXT_PASS (pass_reassoc); - NEXT_PASS (pass_vrp); NEXT_PASS (pass_strength_reduction); NEXT_PASS (pass_dominator); /* The only const/copy propagation opportunities left after @@ -1497,6 +1496,7 @@ init_optimization_passes (void) only examines PHIs to discover const/copy propagation opportunities. */ NEXT_PASS (pass_phi_only_cprop); + NEXT_PASS (pass_vrp); NEXT_PASS (pass_cd_dce); NEXT_PASS (pass_tracer); as DOM also performs constant/copy propagation. That doesn't fix the warning but makes the IL that we feed into VRP2 much more suitable to its working. A patch to disable the < -> != transform fixes this bug and I am going to test that.