https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77308
--- Comment #8 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- analyzing the different thumb1/2 reload dumps, I see t2 often uses code like that to access spill slots: (insn 11576 8090 9941 5 (set (reg:SI 3 r3 [11890]) (plus:SI (reg/f:SI 13 sp) (const_int 480 [0x1e0]))) sha512.c:147 4 {*arm_addsi3} (nil)) (insn 9941 11576 2978 5 (set (reg:DI 2 r2 [4210]) (mem/c:DI (reg:SI 3 r3 [11890]) [5 %sfpD.4158+-3112 S8 A64])) sha512.c:147 170 {*arm_movdi} (nil)) while t1 often does it this way: (insn 8221 8219 4591 6 (set (reg/v:DI 4 r4 [orig:1450 fD.4102 ] [1450]) (mem/c:DI (plus:SI (reg/f:SI 13 sp) (const_int 152 [0x98])) [5 %sfpD.4164+-1432 S8 A64])) sha512.c:155 748 {*thumb1_movdi_insn} (nil)) grep "plus.*reg.*sp" t1/sha512.c.260r.reload |grep -v mem |wc -l 110 grep "plus.*reg.*sp" t2/sha512.c.260r.reload |grep -v mem |wc -l 602 I think in thumb1 the 110 memory accesses are all for frame-objects, like X, a-h, etc, while thumb2 also uses pointers to access spill slots. It must be pretty expensive for thumb1 to access something using a pointer register. But for thumb2 it this strategy creates rather significant register pressure.