On Sat, Nov 9, 2024 at 10:39 PM Takayuki 'January June' Suwa
<jjsuwa_sys3...@yahoo.co.jp> wrote:
>
> The second source register of insn "*extzvsi-1bit_addsubx" cannot be the
> same as the destination register, because that register will be overwritten
> with an intermediate value after insn splitting.
>
>      /* example #1 */
>      int test1(int b, int a) {
>        return ((a & 1024) ? 4 : 0) + b;
>      }
>
>      ;; result #1 (incorrect)
>      test1:
>         extui   a2, a3, 10, 1   ;; overwrites A2 before used
>         addx4   a2, a2, a2
>         ret.n

Interestingly I couldn't reproduce it with the current gcc mainline.
For me it produces the following for the above source:

test1:
       mov.n   a9, a2
       extui   a2, a3, 10, 1
       addx4   a2, a2, a9
       ret.n

With this change the generated code is one instruction shorter,
so applying it still makes sense.

> This patch fixes that.
>
>      ;; result #1 (correct)
>      test1:
>         extui   a3, a3, 10, 1   ;; uses A3 and then overwrites
>         addx4   a2, a3, a2
>         ret.n
>
> However, it should be noted that the first source register can be the same
> as the destination without any problems.
>
>      /* example #2 */
>      int test2(int a, int b) {
>        return ((a & 1024) ? 4 : 0) + b;
>      }
>
>      ;; result (correct)
>      test2:
>         extui   a2, a2, 10, 1   ;; uses A2 and then overwrites
>         addx4   a2, a2, a3
>         ret.n
>
> gcc/ChangeLog:
>
>         * config/xtensa/xtensa.md (*extzvsi-1bit_addsubx):
>         Add '&' to the destination register constraint to indicate that
>         it is 'earlyclobber', append '0' to the first source register
>         constraint to indicate that it can be the same as the destination
>         register, and change the split condition from 1 to reload_completed
>         so that the insn will be split only after RA in order to obtain
>          allocated registers that satisfy the above constraints.
> ---
>   gcc/config/xtensa/xtensa.md | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)

Regtested for target=xtensa-linux-uclibc, no new regressions.
Committed to master

-- 
Thanks.
-- Max

Reply via email to