aco/ra: also prevent overflow register for p_create_vector operands
authorDaniel Schürmann <daniel@schuermann.dev>
Mon, 17 May 2021 08:39:24 +0000 (10:39 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 17 May 2021 11:18:25 +0000 (11:18 +0000)
Fixes: d659ce0d6c5781a1230b182ef5ed1a77de485565 ('aco/ra: prevent underflow register for p_create_vector operands')
Reviewed-by: Tony Wasserka <tony.wasserka@gmx.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10832>

src/amd/compiler/aco_register_allocation.cpp

index bdbda6f..e3679ce 100644 (file)
@@ -1188,7 +1188,10 @@ bool get_reg_specified(ra_ctx& ctx,
                        aco_ptr<Instruction>& instr,
                        PhysReg reg)
 {
-   assert(reg <= 511);
+   /* catch out-of-range registers */
+   if (reg >= PhysReg{512})
+      return false;
+
    std::pair<unsigned, unsigned> sdw_def_info;
    if (rc.is_subdword())
       sdw_def_info = get_subdword_definition_info(ctx.program, instr, rc);
@@ -1387,12 +1390,9 @@ PhysReg get_reg(ra_ctx& ctx,
                 op.getTemp().type() == temp.type() &&
                 ctx.assignments[op.tempId()].assigned) {
                PhysReg reg = ctx.assignments[op.tempId()].reg;
-               /* prevent underflow */
-               if (int(reg.reg_b + byte_offset - k) >= 0) {
-                  reg.reg_b += (byte_offset - k);
-                  if (get_reg_specified(ctx, reg_file, temp.regClass(), instr, reg))
-                     return reg;
-               }
+               reg.reg_b += (byte_offset - k);
+               if (get_reg_specified(ctx, reg_file, temp.regClass(), instr, reg))
+                  return reg;
             }
             k += op.bytes();
          }