Hi Vineet,

However we still see lift up using those blocks - the earliest set computed
contained the supposedly elided bbs.

      Try lift up 0.

          earliest:
            Edge(bb 16 -> bb 17): n_bits = 3, set = {1 }

      Try lift up 1.

          earliest:
            Edge(bb 15 -> bb 16): n_bits = 3, set = {1 }

And subsequently the earliest set is used for rest of the algorithm.

Funny, might be a similar issue as in PR119547. There the lift doesn't consider "transparent" either and I worked around it manually by checking live_in etc.

Can you try whether the following helps?  It does for PR119547.

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 53b064e36a3..1821698e6df 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -3002,6 +3002,9 @@ pre_vsetvl::earliest_fuse_vsetvl_info (int iter)
             || bitmap_count_bits (e) != 1)
           continue;

+         if (!bitmap_bit_p (m_transp[eg->src->index], expr_index))
+           continue;
+

If not we might need the transparency check in the other cases still.

There is fallout but just a single test

 gcc.target/riscv/rvv/vsetvl/avl_single-68.c

Here the issue is that we want to lift vsetvl into a block that is not transparent WRT the vsetvl. It could still be lifted, though, because the conflicting register is only ever used as AVL operand in vsetvls and not by other insns. This special case we don't consider when computing transparency (as it might be compute-heavy).

We could consider it here, though.  What we'd need to do is check whether
only the avl operand (not vl) is set in the block and its uses are only vsetvls. Then we could still perform the lift. But maybe let's rather defer that as an optimization and live with the regression?

--
Regards
Robin

Reply via email to