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.