https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101200
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Note the tree level looks decent: a_6 = d.0_1 >> 4; f_7 = d.0_1 & 15; _2 = (int) f_7; _3 = (int) a_6; _4 = c.b[_2]; c.b[_3] = _4; Which gets expanded (for c.b[_3] and dependents) into: (insn 5 4 0 (set (reg:QI 82 [ d.0_1 ]) (mem/c:QI (symbol_ref:DI ("d") [flags 0x2] <var_decl 0x7f83ad5babd0 d>) [0 d+0 S1 A8])) "t6.c":6:17 -1 (nil)) ..... (insn 12 11 13 (parallel [ (set (reg:QI 93 [ a ]) (lshiftrt:QI (reg:QI 82 [ d.0_1 ]) (const_int 4 [0x4]))) (clobber (reg:CC 17 flags)) ]) "t6.c":6:17 -1 (nil)) (insn 13 12 14 (set (reg:SI 94) (zero_extend:SI (reg:QI 93 [ a ]))) "t6.c":7:6 -1 (nil)) (insn 14 13 15 (set (reg:DI 95) (sign_extend:DI (reg:SI 94))) "t6.c":7:10 -1 (nil)) (insn 15 14 0 (set (mem:SI (plus:DI (mult:DI (reg:DI 95) (const_int 4 [0x4])) (reg/f:DI 92)) [1 c.b[_3]+0 S4 A32]) (reg:SI 85 [ _4 ])) "t6.c":7:10 -1 (nil)) Part of the problem is tracking of QI vs DI modes.