Mesa (staging/21.3): ir3/ra: Check register file upper bound when updating preferred_reg

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 28 20:03:32 UTC 2021


Module: Mesa
Branch: staging/21.3
Commit: 84ad12270709463c013b1b70f46e7132ea54c65a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=84ad12270709463c013b1b70f46e7132ea54c65a

Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date:   Wed Oct 27 13:40:51 2021 +0300

ir3/ra: Check register file upper bound when updating preferred_reg

Otherwise we could get invalid reg in get_reg()

Would fix many dEQP-VK.ssbo.phys.layout.*

Fixes: 0ffcb19b9d9fbe902224542047c389a661fbf816 "ir3: Rewrite register allocation"

Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13546>
(cherry picked from commit aa264ded948defc88930eea7d54800b3188a3ac0)

---

 .pick_status.json          | 2 +-
 src/freedreno/ir3/ir3_ra.c | 9 +++++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 62241299341..9edb40a9038 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -58,7 +58,7 @@
         "description": "ir3/ra: Check register file upper bound when updating preferred_reg",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "0ffcb19b9d9fbe902224542047c389a661fbf816"
     },
diff --git a/src/freedreno/ir3/ir3_ra.c b/src/freedreno/ir3/ir3_ra.c
index 656f5c5511f..1d8b81c0002 100644
--- a/src/freedreno/ir3/ir3_ra.c
+++ b/src/freedreno/ir3/ir3_ra.c
@@ -1031,7 +1031,8 @@ compress_regs_left(struct ra_ctx *ctx, struct ra_file *file, unsigned size,
 }
 
 static void
-update_affinity(struct ir3_register *reg, physreg_t physreg)
+update_affinity(struct ra_file *file, struct ir3_register *reg,
+                physreg_t physreg)
 {
    if (!reg->merge_set || reg->merge_set->preferred_reg != (physreg_t)~0)
       return;
@@ -1039,6 +1040,9 @@ update_affinity(struct ir3_register *reg, physreg_t physreg)
    if (physreg < reg->merge_set_offset)
       return;
 
+   if ((physreg - reg->merge_set_offset + reg->merge_set->size) > file->size)
+      return;
+
    reg->merge_set->preferred_reg = physreg - reg->merge_set_offset;
 }
 
@@ -1231,8 +1235,9 @@ static void
 allocate_dst_fixed(struct ra_ctx *ctx, struct ir3_register *dst,
                    physreg_t physreg)
 {
+   struct ra_file *file = ra_get_file(ctx, dst);
    struct ra_interval *interval = &ctx->intervals[dst->name];
-   update_affinity(dst, physreg);
+   update_affinity(file, dst, physreg);
 
    ra_interval_init(interval, dst);
    interval->physreg_start = physreg;



More information about the mesa-commit mailing list