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