https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119901
--- Comment #2 from Konstantinos Eleftheriou <konstantinos.eleftheriou at vrull dot eu> --- This is fixed by r16-905-gec5349c37afe972ee79b777ee749630b1a0a007e. The culprit was: (insn 23 25 22 2 (set (reg:V16HI 108) (zero_extend:V16HI (reg:V16QI 110))) "testcase.c":8:8 discrim 1 8682 {avx2_zero_extendv16qiv16hi2} (nil)) which is replaced now by: (insn 23 25 22 2 (set (reg:V16HI 108) (subreg:V16HI (reg:V16QI 110) 0)) "testcase.c":8:8 discrim 1 2403 {movv16hi_internal} (nil)) New RTL sequence: (insn 25 21 23 2 (set (mem/c:V16QI (symbol_ref:DI ("v") [flags 0x2] <var_decl 0x7318f2a11e40 v>) [0 MEM <char[1:32]> [(void *)&v]+0 S16 A256]) (reg:V16QI 110)) "testcase.c":8:8 discrim 1 2401 {movv16qi_internal} (nil)) (insn 23 25 22 2 (set (reg:V16HI 108) (subreg:V16HI (reg:V16QI 110) 0)) "testcase.c":8:8 discrim 1 2403 {movv16hi_internal} (nil)) (insn 22 23 20 2 (set (mem/c:V16QI (const:DI (plus:DI (symbol_ref:DI ("v") [flags 0x2] <var_decl 0x7318f2a11e40 v>) (const_int 16 [0x10]))) [0 MEM <char[1:32]> [(void *)&v]+16 S16 A128]) (reg:V16QI 109)) "testcase.c":8:8 discrim 1 2401 {movv16qi_internal} (nil)) (insn 20 22 26 2 (set (subreg:V16QI (reg:V16HI 108) 16) (reg:V16QI 109)) "testcase.c":8:8 discrim 1 2401 {movv16qi_internal} (nil)) (insn 26 20 16 2 (set (reg:V16HI 99 [ _2 ]) (reg:V16HI 108)) "testcase.c":8:8 discrim 1 2403 {movv16hi_internal} (nil)) (insn 16 26 0 2 (set (mem:V16HI (reg/f:DI 107 [ r ]) [1 *r_5(D)+0 S32 A256]) (reg:V16HI 99 [ _2 ])) "testcase.c":8:6 discrim 1 2403 {movv16hi_internal} (expr_list:REG_DEAD (reg/f:DI 107 [ r ]) (expr_list:REG_DEAD (reg:V16HI 99 [ _2 ]) (nil)))) Note that the additional instructions are expected, as we update the "loaded" value using bit insertions.