RISC-V: Eliminate extension after for *w instructions
commit99bfdb072e67fa3fe294d86b4b2a9f686f8d9705
authorJeff Law <jlaw@ventanamicro.com>
Wed, 7 Jun 2023 19:40:16 +0000 (7 13:40 -0600)
committerJeff Law <jlaw@ventanamicro.com>
Wed, 7 Jun 2023 19:58:57 +0000 (7 13:58 -0600)
treea98a4e215709cab21ecb3e85b4597043e55ff9f4
parent7f26e76c9848aeea9ec10ea701a6168464a4a9c2
RISC-V: Eliminate extension after for *w instructions

This patch tries to prevent generating unnecessary sign extension
after *w instructions like "addiw" or "divw".

The main idea of it is to add SUBREG_PROMOTED fields during expanding.

I have tested on SPEC2017 there is no regression.
Only gcc.dg/pr30957-1.c test failed.
To solve that I did some changes in loop-iv.cc, but not sure that it is
suitable.

gcc/ChangeLog:
* config/riscv/bitmanip.md (rotrdi3, rotrsi3, rotlsi3): New expanders.
(rotrsi3_sext): Expose generator.
(rotlsi3 pattern): Hide generator.
* config/riscv/riscv-protos.h (riscv_emit_binary): New function
declaration.
* config/riscv/riscv.cc (riscv_emit_binary): Removed static
* config/riscv/riscv.md (addsi3, subsi3, negsi2): Hide generator.
(mulsi3, <optab>si3): Likewise.
(addsi3, subsi3, negsi2, mulsi3, <optab>si3): New expanders.
(addv<mode>4, subv<mode>4, mulv<mode>4): Use riscv_emit_binary.
(<u>mulsidi3): Likewise.
(addsi3_extended, subsi3_extended, negsi2_extended): Expose generator.
(mulsi3_extended, <optab>si3_extended): Likewise.
(splitter for shadd feeding divison): Update RTL pattern to account
for changes in how 32 bit ops are expanded for TARGET_64BIT.
* loop-iv.cc (get_biv_step_1): Process src of extension when it PLUS.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/shift-and-2.c: New tests.
* gcc.target/riscv/shift-shift-2.c: Adjust expected output.
* gcc.target/riscv/sign-extend.c: New test.
* gcc.target/riscv/zbb-rol-ror-03.c: Adjust expected output.

Co-authored-by: Jeff Law <jlaw@ventanamicro.com>
gcc/config/riscv/bitmanip.md
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.md
gcc/loop-iv.cc
gcc/testsuite/gcc.target/riscv/shift-and-2.c
gcc/testsuite/gcc.target/riscv/shift-shift-2.c
gcc/testsuite/gcc.target/riscv/sign-extend.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/zbb-rol-ror-03.c