https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110163
Jeffrey A. Law <law at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |FIXED --- Comment #5 from Jeffrey A. Law <law at gcc dot gnu.org> --- Fixed on the trunk. Most likely all the work we've done to fixup how we handle SImode results (by indirecting through a DImode extended temporary): (insn 11 73 12 3 (set (reg:SI 140) (zero_extend:SI (mem:QI (plus:DI (reg/v/f:DI 135 [ x ]) (const_int 1 [0x1])) [0 MEM <char[1:12]> [(void *)x_2(D)]+1 S1 A8]))) "j.c":4:11 125 {*zero_extendqisi2_internal} (nil)) (insn 12 11 13 3 (set (reg:DI 141) (sign_extend:DI (plus:SI (reg:SI 140) (const_int -111 [0xffffffffffffff91])))) "j.c":4:11 8 {addsi3_extended} (nil)) (insn 13 12 14 3 (set (reg:SI 136) (subreg/s/u:SI (reg:DI 141) 0)) "j.c":4:11 278 {*movsi_internal} (expr_list:REG_EQUAL (plus:SI (reg:SI 140) (const_int -111 [0xffffffffffffff91])) (nil))) (insn 14 13 15 3 (set (reg:DI 142) (sign_extend:DI (reg:SI 136))) "j.c":4:11 127 {*extendsidi2_internal} (nil)) (jump_insn 15 14 74 3 (set (pc) (if_then_else (ne (reg:DI 142) (const_int 0 [0])) (label_ref 64) (pc))) "j.c":4:11 371 {*branchdi} (int_list:REG_BR_PROB 536870916 (nil)) In particular note insns 12, 13, 14. The extention at insn 14 will be removed as redundant leaving us with code like this for any given byte: lbu a5,2(a0) # 16 [c=28 l=4] *zero_extendqisi2_internal/1 addiw a5,a5,-119 # 17 [c=8 l=4] addsi3_extended/1 mv a4,a5 # 18 [c=4 l=4] *movsi_internal/0 bne a5,zero,.L2 # 20 [c=12 l=4] *branchdi Where the copy from a5->a4 is needed for the exit path.