https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51708
--- Comment #4 from Oleg Endo <olegendo at gcc dot gnu.org> --- There are also constants generated during reload. This is a snippet from bzip blocksort.c: .L6: mov.b @r5+,r1 dt r3 mov.w .L175,r7 // r7 = 1868 extu.b r1,r1 add r15,r7 // r7 = r15 + 1868 shll2 r1 add r7,r1 mov.l @r1,r7 add #1,r7 bf/s .L6 mov.l r7,@r1 ... .L175: .short 1868 where the constant load can be hoisted, assuming that r0 is not live throughout the loop: mov.w .L175,r0 // r0 = 1868 add r15,r0 // r0 = r15 + 1868 .L6: mov.b @r5+,r1 dt r3 extu.b r1,r1 shll2 r1 add r0,r1 mov.l @r1,r7 add #1,r7 bf/s .L6 mov.l r7,@r1 ... .L175: .short 1868 Applying addressing mode optimization afterwards can eliminate another insn from the loop: mov.w .L175,r0 // r0 = 1868 add r15,r0 // r0 = r15 + 1868 .L6: mov.b @r5+,r1 dt r3 extu.b r1,r1 shll2 r1 mov.l @(r0,r1),r7 add #1,r7 bf/s .L6 mov.l r7,@(r0,r1) ... .L175: .short 1868 If there is no free register available it might be beneficial to insert pushs/pops around the loop to free up registers for the loop.