freedreno/ir3: Fix sz vs class confusion

Add bounds checking to make sure we don't silently access out of
bounds again.

Fixes: 90f7d12236 ("freedreno/ir3/ra: pick higher numbered scalars in first pass")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4503>
This commit is contained in:
Kristian H. Kristensen
2020-04-09 15:57:41 -07:00
parent 65e2eaa4d3
commit 5ec1f264f1
2 changed files with 24 additions and 6 deletions

View File

@@ -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) {

View File

@@ -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)