freedreno/ir3: Fix sz vs class confusion
authorKristian H. Kristensen <hoegsberg@google.com>
Thu, 9 Apr 2020 22:57:41 +0000 (15:57 -0700)
committerKristian H. Kristensen <hoegsberg@google.com>
Fri, 10 Apr 2020 17:24:14 +0000 (10:24 -0700)
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
src/freedreno/ir3/ir3_ra.h

index 7999bb34f7112392104954fdb76334fcef756c0f..aa200a0062057a3c0a368d735e64d086b9a93d6c 100644 (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) {
index 43b5726648dcaedbcc8c38dc1fd8b211a48c7400..1e675a0bbd58d3d309809186f3db3da52e9592ab 100644 (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)