https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91775
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Target| |x86_64-*-*, i?86-*-* Status|UNCONFIRMED |NEW Last reconfirmed| |2019-09-16 CC| |amker at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- IVOPTS considers Candidate 3: Var befor: ivtmp.6 Var after: ivtmp.6 Incr POS: before exit test IV struct: Type: unsigned int Base: 1023 Step: 4294967295 Biv: N Overflowness wrto loop niter: Overflow thus decrement to zero candidates but not increment to zero. I'm not sure why it rejects this - candidate cost seems OK. IVOPTs does consider decrement to zero specially: /* When the condition is a comparison of the candidate IV against zero, prefer this IV. TODO: The constant that we're subtracting from the cost should be target-dependent. This information should be added to the target costs for each backend. */ if (!elim_cost.infinite_cost_p () /* Do not try to decrease infinite! */ && integer_zerop (*bound_cst) && (operand_equal_p (*control_var, cand->var_after, 0) || operand_equal_p (*control_var, cand->var_before, 0))) elim_cost -= 1; so there must be other differences (the != 0 offset in the address uses) compensating for it. Bin may be able to decipher the IVOPTs dump to say what causes another IV to be selected.