https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105596
--- Comment #1 from Peter Cordes <peter at cordes dot ca> --- https://godbolt.org/z/aoG55T5Yq gcc -O3 -m32 has the same problem with unsigned long long total and unsigned i. Pretty much identical instruction sequences in the loop for all 3 versions, doing add/adc to increment i, for example. (Plus a bit of spilling). fact_gcc_handhold still compiles without the unnecessary widening. Perhaps should retitle to widen to a "2-register type". IDK how easily this occurs in real-world loops with 64 and 32-bit integers on 32-bit machines, but that's probably more of a concern for wasting more clock cycles worldwide.