summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2020-04-13 11:14:23 -0700
committerMarge Bot <eric+marge@anholt.net>2020-04-29 19:46:08 +0000
commit05e6f763e7683c13a59e14f12ce3231d892921c2 (patch)
tree1db0cce2a5f585d564d35cfb178b638b5d861073
parent53ac2dabec45cc329eb033679db6fdd5a8221851 (diff)
util/ra: Improve ra_set_finalize() performance.
BITSET_FOR_EACH_SET can walk a sparse set (such as a register class's set of registers) much faster than just iterating over individual bits. Improves freedreno startup time (as measured by shader-db ./run shaders/closed/gputest/triangle on my x86 system) by -4.12679% +/- 1.99006% (n=151) Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4537>
-rw-r--r--src/util/register_allocate.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/src/util/register_allocate.c b/src/util/register_allocate.c
index 091500710a9..c0cd879c9ca 100644
--- a/src/util/register_allocate.c
+++ b/src/util/register_allocate.c
@@ -400,12 +400,9 @@ ra_set_finalize(struct ra_regs *regs, unsigned int **q_values)
unsigned int rc;
int max_conflicts = 0;
- for (rc = 0; rc < regs->count; rc++) {
+ BITSET_FOREACH_SET(rc, regs->classes[c]->regs, regs->count) {
int conflicts = 0;
- if (!reg_belongs_to_class(rc, regs->classes[c]))
- continue;
-
util_dynarray_foreach(&regs->regs[rc].conflict_list,
unsigned int, rbp) {
unsigned int rb = *rbp;