On Mon, Jun 13, 2022 at 8:54 PM Takayuki 'January June' Suwa <jjsuwa_sys3...@yahoo.co.jp> wrote: > > RTL expansion of substitution to [DS]Cmode hard register includes obstructive > register clobber. > > A simplest example: > > double _Complex test(double _Complex c) { > return c; > } > > will be converted to: > > (set (reg:DF 42 [ c ]) (reg:DF 2 a2)) > (set (reg:DF 43 [ c+8 ]) (reg:DF 4 a4)) > (clobber (reg:DC 2 a2)) > (set (reg:DF 2 a2) (reg:DF 42 [ c ])) > (set (reg:DF 4 a4) (reg:DF 43 [ c+8 ])) > (use (reg:DC 2 a2)) > (return) > > and then finally: > > test: > mov a8, a2 > mov a9, a3 > mov a6, a4 > mov a7, a5 > mov a2, a8 > mov a3, a9 > mov a4, a6 > mov a5, a7 > ret > > As you see, it is so ridiculous. > > This patch eliminates such clobber in order to prune away the wasted move > instructions by the optimizer: > > test: > ret > > gcc/ChangeLog: > > * config/xtensa/xtensa.md (DSC): New split pattern and mode iterator. > --- > gcc/config/xtensa/xtensa.md | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+)
Regtested for target=xtensa-linux-uclibc, no new regressions. Committed to master. -- Thanks. -- Max