diff options
author | Boris Brezillon <boris.brezillon@collabora.com> | 2021-04-22 16:02:36 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-04-22 16:59:18 +0000 |
commit | 54a4e75223e57e22a21c46d3b7721b5943f5d044 (patch) | |
tree | 415e2a756ba73110247e39c00b90bda80356e73c /src/panfrost/midgard/midgard_address.c | |
parent | c09439721c3a6b609cd510999054f284115da3a2 (diff) |
pan/midg: Make sure the constant offset is in range in mir_match_iadd()
The offset field is an 18-bit signed integer, if the offset is bigger
than that we can get rid of the intermediate iadd.
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10332>
Diffstat (limited to 'src/panfrost/midgard/midgard_address.c')
-rw-r--r-- | src/panfrost/midgard/midgard_address.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/panfrost/midgard/midgard_address.c b/src/panfrost/midgard/midgard_address.c index 54e942a3457..c55e0fbe2c5 100644 --- a/src/panfrost/midgard/midgard_address.c +++ b/src/panfrost/midgard/midgard_address.c @@ -85,6 +85,9 @@ mir_match_constant(struct mir_address *address) /* Matches an iadd when there is a free slot or constant */ +/* The offset field is a 18-bit signed integer */ +#define MAX_POSITIVE_OFFSET ((1 << 17) - 1) + static void mir_match_iadd(struct mir_address *address, bool first_free) { @@ -101,13 +104,17 @@ mir_match_iadd(struct mir_address *address, bool first_free) nir_ssa_scalar op1 = nir_ssa_scalar_chase_alu_src(address->B, 0); nir_ssa_scalar op2 = nir_ssa_scalar_chase_alu_src(address->B, 1); - if (nir_ssa_scalar_is_const(op1)) { + if (nir_ssa_scalar_is_const(op1) && + nir_ssa_scalar_as_uint(op1) <= MAX_POSITIVE_OFFSET) { address->bias += nir_ssa_scalar_as_uint(op1); address->B = op2; - } else if (nir_ssa_scalar_is_const(op2)) { + } else if (nir_ssa_scalar_is_const(op2) && + nir_ssa_scalar_as_uint(op2) <= MAX_POSITIVE_OFFSET) { address->bias += nir_ssa_scalar_as_uint(op2); address->B = op1; - } else if (first_free && !address->A.def) { + } else if (!nir_ssa_scalar_is_const(op1) && + !nir_ssa_scalar_is_const(op2) && + first_free && !address->A.def) { address->A = op1; address->B = op2; } |