https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102758
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |minor Keywords|needs-bisection | Summary|[12 Regression] Failure to |[12 Regression] Failure to |use registers optimally |use registers optimally |with return values (2 |with return values (2 |operands related) |operands related and | |subreg) --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So the difference in the IR happens from forwprop. before RA we have this for the old compiler: (insn 9 8 14 2 (set (reg:V8HI 89) (plus:V8HI (reg:V8HI 90) (subreg:V8HI (reg:V2DI 91) 0))) "/app/example.cpp":8:29 3418 {*addv8hi3} (expr_list:REG_DEAD (reg:V2DI 91) (expr_list:REG_DEAD (reg:V8HI 90) (nil)))) (insn 14 9 15 2 (set (reg/i:V2DI 20 xmm0) (subreg:V2DI (reg:V8HI 89) 0)) "/app/example.cpp":9:1 1439 {movv2di_internal} (expr_list:REG_DEAD (reg:V8HI 89) (nil))) With the new compile we have: (insn 10 9 14 2 (set (subreg:V8HI (reg:V2DI 84 [ <retval> ]) 0) (plus:V8HI (reg:V8HI 90) (subreg:V8HI (reg:V2DI 91) 0))) "/app/example.cpp":8:41 5787 {*addv8hi3} (expr_list:REG_DEAD (reg:V8HI 90) (expr_list:REG_DEAD (reg:V2DI 91) (nil)))) (insn 14 10 15 2 (set (reg/i:V2DI 20 xmm0) (reg:V2DI 84 [ <retval> ])) "/app/example.cpp":9:1 1634 {movv2di_internal} (expr_list:REG_DEAD (reg:V2DI 84 [ <retval> ]) (nil))) This now confuses the register allocator. So this is only an issue with return because of the hard register being involved. So this is a minor issue and not much of a problem unless you are doing microbenchmarking.