https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64537
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Target Milestone|--- |9.0 Status|NEW |RESOLVED --- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- GCC9+ does: subs x3, x0, x1, sxth 3 add w1, w2, w1, sxth add w1, w1, w3 add w0, w2, w0 csel w0, w1, w0, ne ret GCC 8 produced: sxth w1, w1 subs x3, x0, x1, sxth 3 add w1, w1, w2 add w1, w1, w3 add w0, w2, w0 csel w0, w1, w0, ne ret GCC 9's combine is able to do this: Trying 3 -> 8: 3: r99:SI=sign_extend(x1:HI) REG_DEAD x1:HI 8: r101:DI=sign_extend(r99:SI#0) Failed to match this instruction: (parallel [ (set (reg:DI 101 [ b ]) (sign_extend:DI (reg:HI 1 x1 [ b ]))) (set (reg/v:SI 99 [ b ]) (sign_extend:SI (reg:HI 1 x1 [ b ]))) ]) Failed to match this instruction: (parallel [ (set (reg:DI 101 [ b ]) (sign_extend:DI (reg:HI 1 x1 [ b ]))) (set (reg/v:SI 99 [ b ]) (sign_extend:SI (reg:HI 1 x1 [ b ]))) ]) Successfully matched this instruction: (set (reg/v:SI 99 [ b ]) (sign_extend:SI (reg:HI 1 x1 [ b ]))) Successfully matched this instruction: (set (reg:DI 101 [ b ]) (sign_extend:DI (reg:HI 1 x1 [ b ]))) allowing combination of insns 3 and 8 original costs 4 + 4 = 8 replacement costs 4 + 4 = 8 So fixed by r9-2064.