[Mesa-dev] [PATCH 2/6] util/ra: Add a function for making all conflicts on a register transitive
Jason Ekstrand
jason at jlekstrand.net
Sat Aug 15 11:31:23 PDT 2015
---
src/util/register_allocate.c | 23 +++++++++++++++++++++++
src/util/register_allocate.h | 1 +
2 files changed, 24 insertions(+)
diff --git a/src/util/register_allocate.c b/src/util/register_allocate.c
index 436e008..c9867e3 100644
--- a/src/util/register_allocate.c
+++ b/src/util/register_allocate.c
@@ -266,6 +266,29 @@ ra_add_transitive_reg_conflict(struct ra_regs *regs,
}
}
+/**
+ * Makes every conflict on the given register transitive. In other words,
+ * every register that conflicts with r will now conflict with every other
+ * register conflicting with r.
+ *
+ * This can simplify code for setting up multiple register classes
+ * which are aggregates of some base hardware registers, compared to
+ * explicitly using ra_add_reg_conflict.
+ */
+void
+ra_make_reg_conflicts_transitive(struct ra_regs *regs, unsigned int r)
+{
+ struct ra_reg *reg = ®s->regs[r];
+ BITSET_WORD tmp;
+ int c;
+
+ BITSET_FOREACH_SET(c, tmp, reg->conflicts, regs->count) {
+ struct ra_reg *other = ®s->regs[c];
+ for (unsigned i = 0; i < BITSET_WORDS(regs->count); i++)
+ other->conflicts[i] |= reg->conflicts[i];
+ }
+}
+
unsigned int
ra_alloc_reg_class(struct ra_regs *regs)
{
diff --git a/src/util/register_allocate.h b/src/util/register_allocate.h
index 61f182e..ed3854c 100644
--- a/src/util/register_allocate.h
+++ b/src/util/register_allocate.h
@@ -51,6 +51,7 @@ void ra_add_reg_conflict(struct ra_regs *regs,
unsigned int r1, unsigned int r2);
void ra_add_transitive_reg_conflict(struct ra_regs *regs,
unsigned int base_reg, unsigned int reg);
+void ra_make_reg_conflicts_transitive(struct ra_regs *regs, unsigned int reg);
void ra_class_add_reg(struct ra_regs *regs, unsigned int c, unsigned int reg);
void ra_set_num_conflicts(struct ra_regs *regs, unsigned int class_a,
unsigned int class_b, unsigned int num_conflicts);
--
2.4.3
More information about the mesa-dev
mailing list