https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69992
--- Comment #2 from acsawdey at gcc dot gnu.org --- Digging deeper, if i is not 64-bit, we don't choose it as one of the IVs, and the loop iteration test gets converted based on ap instead. Then the math in iv_number_of_iterations decides that it might be an infinite loop somehow. As a result, doloop conversion isn't done, then later doloop_condition_get fails to find the loop count register, and SMS is not done. Loop 1 is simple: simple exit 5 -> 6 infinite if: (expr_list:REG_DEP_TRUE (ne:SI (and:DI (minus:DI (plus:DI (ashift:DI (reg:DI 211) (const_int 2 [0x2])) (reg/v/f:DI 205 [ ap ])) (reg:DI 193 [ ivtmp.20 ])) (const_int 3 [0x3])) (const_int 0 [0])) (nil)) number of iterations: (lshiftrt:DI (plus:DI (minus:DI (reg:DI 203 [ _58 ]) (reg:DI 193 [ ivtmp.20 ])) (const_int -4 [0xfffffffffffffffc])) (const_int 2 [0x2])) upper bound: 4294967294 likely upper bound: 4294967294 realistic bound: -1 Doloop: Possible infinite iteration case. Doloop: The loop is not suitable.