https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68273
--- Comment #3 from Jeffrey A. Law <law at redhat dot com> --- Created attachment 37414 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37414&action=edit Reduced testcase Reduced testcase. Compile with a mipsel-linux-gnu cross compiler with -O2. It's easiest to see the problem looking at the .expand dump: ;; _17 = enter (_14, prephitmp_23); (insn 81 80 82 (set (reg/f:SI 262) (symbol_ref:SI ("sp") <var_decl 0x7f289897eab0 sp>)) j.c:58 -1 (nil)) (insn 82 81 83 (set (reg/f:SI 261) (mem/f/c:SI (reg/f:SI 262) [10 sp+0 S4 A32])) j.c:58 -1 (nil)) (insn 83 82 84 (set (reg:SI 263) (mem/f:SI (reg/f:SI 261) [12 sp.0_13->table+0 S4 A32])) j.c:58 -1 (nil)) (insn 84 83 85 (set (reg:SI 6 $6) (reg/f:SI 255 [ prephitmp_23 ])) j.c:58 -1 (nil)) (insn 85 84 86 (set (reg:SI 4 $4) (reg:SI 263)) j.c:58 -1 (nil)) (call_insn 86 85 87 (parallel [ (set (reg:SI 2 $2) (call (mem:SI (symbol_ref:SI ("enter") [flags 0x41] <function_decl 0x7f2890d2ca80 enter>) [0 enter S4 A32]) (const_int 16 [0x10]))) (clobber (reg:SI 31 $31)) ]) j.c:58 -1 (expr_list:REG_CALL_DECL (symbol_ref:SI ("enter") [flags 0x41] <function_decl 0x7f2890d2ca80 enter>) (nil)) (expr_list (use (reg:SI 79 $fakec)) (expr_list:SI (use (reg:SI 4 $4)) (expr_list:SI (use (reg:SI 6 $6)) (nil))))) Note carefully the 2nd argument to the enter call is loaded into $6. It should have been loaded into $5. AFAICT, SRA is mucking around with the alignment of the object, which in turn causes the MIPS backend to want to pass the object in an aligned register pair.