summaryrefslogtreecommitdiff
path: root/src/panfrost/midgard/midgard_address.c
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@collabora.com>2021-04-22 16:02:36 +0200
committerMarge Bot <eric+marge@anholt.net>2021-04-22 16:59:18 +0000
commit54a4e75223e57e22a21c46d3b7721b5943f5d044 (patch)
tree415e2a756ba73110247e39c00b90bda80356e73c /src/panfrost/midgard/midgard_address.c
parentc09439721c3a6b609cd510999054f284115da3a2 (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.c13
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;
}