Mesa (master): freedreno/ir3: Fix sz vs class confusion
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Apr 10 17:40:07 UTC 2020
Module: Mesa
Branch: master
Commit: 5ec1f264f1f70806fe266606d3376a898a96292d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5ec1f264f1f70806fe266606d3376a898a96292d
Author: Kristian H. Kristensen <hoegsberg at google.com>
Date: Thu Apr 9 15:57:41 2020 -0700
freedreno/ir3: Fix sz vs class confusion
Add bounds checking to make sure we don't silently access out of
bounds again.
Fixes: 90f7d12236c ("freedreno/ir3/ra: pick higher numbered scalars in first pass")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4503>
---
src/freedreno/ir3/ir3_ra.c | 6 +++---
src/freedreno/ir3/ir3_ra.h | 24 +++++++++++++++++++++---
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/freedreno/ir3/ir3_ra.c b/src/freedreno/ir3/ir3_ra.c
index 7999bb34f71..aa200a00620 100644
--- a/src/freedreno/ir3/ir3_ra.c
+++ b/src/freedreno/ir3/ir3_ra.c
@@ -441,11 +441,11 @@ ra_select_reg_merged(unsigned int n, BITSET_WORD *regs, void *data)
if (!ctx->scalar_pass) {
base = ctx->set->gpr_to_ra_reg[class][0];
if (high) {
- max_target = HIGH_CLASS_REGS(sz);
+ max_target = HIGH_CLASS_REGS(class - HIGH_OFFSET);
} else if (half) {
- max_target = HALF_CLASS_REGS(sz);
+ max_target = HALF_CLASS_REGS(class - HALF_OFFSET);
} else {
- max_target = CLASS_REGS(sz);
+ max_target = CLASS_REGS(class);
}
if ((sz == 1) && !high) {
diff --git a/src/freedreno/ir3/ir3_ra.h b/src/freedreno/ir3/ir3_ra.h
index 43b5726648d..1e675a0bbd5 100644
--- a/src/freedreno/ir3/ir3_ra.h
+++ b/src/freedreno/ir3/ir3_ra.h
@@ -63,9 +63,27 @@ static const unsigned high_class_sizes[] = {
#define NUM_HIGH_REGS (4 * 8) /* r48 to r55 */
#define FIRST_HIGH_REG (4 * 48)
/* Number of virtual regs in a given class: */
-#define CLASS_REGS(i) (NUM_REGS - (class_sizes[i] - 1))
-#define HALF_CLASS_REGS(i) (NUM_REGS - (half_class_sizes[i] - 1))
-#define HIGH_CLASS_REGS(i) (NUM_HIGH_REGS - (high_class_sizes[i] - 1))
+
+static inline unsigned CLASS_REGS(unsigned i)
+{
+ assert(i < class_count);
+
+ return (NUM_REGS - (class_sizes[i] - 1));
+}
+
+static inline unsigned HALF_CLASS_REGS(unsigned i)
+{
+ assert(i < half_class_count);
+
+ return (NUM_REGS - (half_class_sizes[i] - 1));
+}
+
+static inline unsigned HIGH_CLASS_REGS(unsigned i)
+{
+ assert(i < high_class_count);
+
+ return (NUM_HIGH_REGS - (high_class_sizes[i] - 1));
+}
#define HALF_OFFSET (class_count)
#define HIGH_OFFSET (class_count + half_class_count)
More information about the mesa-commit
mailing list