From 5ec1f264f1f70806fe266606d3376a898a96292d Mon Sep 17 00:00:00 2001 From: "Kristian H. Kristensen" Date: Thu, 9 Apr 2020 15:57:41 -0700 Subject: [PATCH] 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: --- 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) -- 2.30.2