Hi Richard,

Thanks for taking the time to review the code.

On 2023/11/8 15:57, Richard Biener wrote:
On Wed, Nov 8, 2023 at 4:48 AM Lehua Ding <lehua.d...@rivai.ai> wrote:

This patch does not make any functional changes. It mainly refactor two parts:

1. The ira_allocno's objects field is expanded to an scalable array, and 
multi-word
    pseduo registers are split and tracked only when necessary.
2. Since the objects array has been expanded, there will be more subreg objects
    that pass through later, rather than the previous fixed two. Therefore, it
    is necessary to modify the detection of whether two objects conflict, and
    the check method is to pull back the registers occupied by the object to
    the first register of the allocno for judgment.

Did you profile this before/after?  RA performance is critical ...

Based on the data I ran earlier, the performance changes on spec2017 were very slight. I'll run again and give you the data.Based on my expectations, the impact on existing performance should all be minimal. Except for examples like the ones I put up.

diff --git a/gcc/hard-reg-set.h b/gcc/hard-reg-set.h
index b0bb9bce074..760eadba186 100644
--- a/gcc/hard-reg-set.h
+++ b/gcc/hard-reg-set.h
@@ -113,6 +113,39 @@ struct HARD_REG_SET
      return !operator== (other);
    }

+  HARD_REG_SET
+  operator>> (unsigned int shift_amount) const

This is a quite costly operation, why do we need it instead
of keeping an "offset" for set queries?

Because there are logic operations after the shift. For a mutil hardreg pseudo register, it will record the physical registers of each part of the conflict, and different parts of the offset are different, and we need to unify these differences to the conflict against the first single reg of the pseduo register. That is to say, first we need to convert it to a conflict against the first_single_reg, and then we need to collect all the conflicting registers (by OR operation). like this:

*start_conflict_regs |= OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) >> (OBJECT_START (obj) + j)

+/* Return the object in allocno A which match START & NREGS.  */
+ira_object_t
+find_object (ira_allocno_t a, int start, int nregs)
+{
+  for (ira_object_t obj : a->objects)

linear search?  really?

I was thinking about the fact that most allocno's have only one objects, and most of the others don't have more than 10, so I chose this easiest way to find them. Thanks for the heads up, it's really not very good here, I'll see if there's a faster way.

--
Best,
Lehua (RiVAI)
lehua.d...@rivai.ai

Reply via email to