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

Reply via email to