https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116398
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (insn 6 3 12 2 (set (reg:DI 105 [ dataD.4432 ]) (sign_extend:DI (reg/v:SI 102 [ dataD.4432 ]))) "/app/example.cpp":3:12 105 {*extendsidi2_aarch64} (expr_list:REG_DEAD (reg/v:SI 102 [ dataD.4432 ]) (nil))) (insn 12 6 13 2 (set (reg:DI 110 [ _3+8 ]) (ashiftrt:DI (reg:DI 105 [ dataD.4432 ]) (const_int 11 [0xb]))) "/app/example.cpp":3:29 755 {*aarch64_ashr_sisd_or_int_di3} (nil)) (insn 13 12 23 2 (set (reg:DI 109 [ _3 ]) (ashift:DI (reg:DI 105 [ dataD.4432 ]) (const_int 53 [0x35]))) "/app/example.cpp":3:29 751 {*aarch64_ashl_sisd_or_int_di3} (expr_list:REG_DEAD (reg:DI 105 [ dataD.4432 ]) (nil))) ... Could be just simplified to (ignore the ordering difference): (insn 23 13 24 2 (set (reg:DI 109 [ _3+8 ]) (ashift:DI (subreg:DI (reg:SI 105) 0) (const_int 53 [0x35]))) "/app/example.cpp":4:1 751 {*aarch64_ashl_sisd_or_int_di3} (nil)) (insn 24 23 19 2 (set (reg:DI 110 [ _3 ]) (sign_extract:DI (subreg:DI (reg:SI 105) 0) (const_int 21 [0x15]) (const_int 11 [0xb]))) "/app/example.cpp":4:1 801 {*extvdi} (expr_list:REG_DEAD (reg:SI 113) (nil))) Which is what combine did in GCC 14. Is this because only combine knows creats sign_extract?