diff --git a/src/freedreno/decode/checkregs.c b/src/freedreno/decode/checkregs.c index a0ca810b269..ec1fa9c0fef 100644 --- a/src/freedreno/decode/checkregs.c +++ b/src/freedreno/decode/checkregs.c @@ -15,6 +15,28 @@ * for any given generation. */ +struct range { + uint32_t min, max; +}; + +static struct range +elem_range(const struct rnndelem *e) +{ + uint32_t len; + + if (e->type == RNN_ETYPE_ARRAY) { + len = e->length * e->stride; + } else { + assert(e->width >= 32); + len = e->width / 32; + } + + return (struct range){ + .min = e->offset, + .max = e->offset + len - 1, + }; +} + int main(int argc, char **argv) { @@ -36,11 +58,7 @@ main(int argc, char **argv) if (!rnndec_varmatch(rnn->vc, &ei->varinfo)) continue; - uint32_t mini = ei->offset; - uint32_t maxi = mini; - - if (ei->type == RNN_ETYPE_ARRAY) - maxi = mini + ei->length - 1; + struct range ri = elem_range(ei); for (unsigned j = i + 1; j < rnn->dom[0]->subelemsnum; j++) { struct rnndelem *ej = rnn->dom[0]->subelems[j]; @@ -48,15 +66,11 @@ main(int argc, char **argv) if (!rnndec_varmatch(rnn->vc, &ej->varinfo)) continue; - uint32_t minj = ej->offset; - uint32_t maxj = minj; + struct range rj = elem_range(ej); - if (ej->type == RNN_ETYPE_ARRAY) - maxj = minj + ej->length - 1; - - if ((maxi >= minj) && (maxj >= mini)) { + if ((ri.max >= rj.min) && (rj.max >= ri.min)) { fprintf(stderr, "Conflict: %s (0x%04x->0x%04x) vs %s (0x%04x->0x%04x)\n", - ei->name, mini, maxi, ej->name, minj, maxj); + ei->name, ri.min, ri.max, ej->name, rj.min, rj.max); ret = -1; } }