This patch addresses a missed opportunity to fuse vsetvl_infos.
Instead of checking whether demands for merging configurations of
vsetvl_info are all met, the demands are checked individually.

  The case in question occurs because of the conditional move
instruction which sifive-7, sifive-p400 and sifive-p600 support.
Firstly, the conditional move generated rearranges the CFG.
Secondly, because the conditional move generated uses
the same register in the if_then_else pattern as vsetvli before it
curr_info and prev_info won't be merged.

  Tested for tune={sifive-7-series, sifive-p400-series, sifive-p600-series}
and arch={rv64gcv, rv32gcv} making no new regressions.
The fusion performed also makes the following tests pass:
* vsetvlmax-9.c
* vsetvlmax-10.c
* vsetvlmax-11.c
* vsetvlmax-15.c
for all tune configurations mentioned. Specifically, the
scan-assembler-times 
vsetvli\\s+[a-x0-9]+,\\s*zero,\\s*e32,\\s*m1,\\s*t[au],\\s*m[au] 1
tests in previously mentioned files are now passing.

2024-09-10 Dusan Stojkovic <dusan.stojko...@rt-rk.com>

PR target/113035 - RISC-V: regression testsuite errors -mtune=sifive-7-series

        PR target/113035

gcc\ChangeLog:

        * config/riscv/riscv-vsetvl.cc (pre_vsetvl::earliest_fuse_vsetvl_info):
---
 gcc/config/riscv/riscv-vsetvl.cc | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 017efa8bc17..f93e0c313b6 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -3052,6 +3052,22 @@ pre_vsetvl::earliest_fuse_vsetvl_info (int iter)
          else
            {
              vsetvl_info &prev_info = src_block_info.get_exit_info ();
+             if (TARGET_SFB_ALU
+             && prev_info.valid_p ()
+             && curr_info.valid_p ()
+             && prev_info.vl_used_by_non_rvv_insn_p ()
+             && !curr_info.vl_used_by_non_rvv_insn_p ())
+             {
+               // Try to merge each demand individually
+               if (m_dem.sew_lmul_compatible_p (prev_info, curr_info))
+               {
+                 m_dem.merge_sew_lmul (prev_info, curr_info);
+               }
+               if (m_dem.policy_compatible_p (prev_info, curr_info))
+               {
+                 m_dem.merge_policy (prev_info, curr_info);
+               }
+             }
              if (!prev_info.valid_p ()
                  || m_dem.available_p (prev_info, curr_info)
                  || !m_dem.compatible_p (prev_info, curr_info))
--
2.43.0

CONFIDENTIALITY: The contents of this e-mail are confidential and intended only 
for the above addressee(s). If you are not the intended recipient, or the 
person responsible for delivering it to the intended recipient, copying or 
delivering it to anyone else or using it in any unauthorized manner is 
prohibited and may be unlawful. If you receive this e-mail by mistake, please 
notify the sender and the systems administrator at straym...@rt-rk.com 
immediately.

Reply via email to