lima: gpir: enforce instruction limit earlier
authorVasily Khoruzhick <anarsoul@gmail.com>
Thu, 5 Mar 2020 06:16:30 +0000 (22:16 -0800)
committerMarge Bot <eric+marge@anholt.net>
Fri, 6 Mar 2020 21:06:54 +0000 (21:06 +0000)
Enforce instruction limit of 512 instructions earlier. This is a
workaround for infinite loops in gpir compiler and allows us to
pin point the tests that are affected.

Reviewed-by: Andreas Baierl <ichgeh@imkreisrum.de>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4055>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4055>

src/gallium/drivers/lima/ir/gp/codegen.c
src/gallium/drivers/lima/ir/gp/instr.c

index 113a8a0c0f34ca8458aeb4213d434220b2385767..80560bd5f7741e37566e0fe3c65bf38635d0bae6 100644 (file)
@@ -562,11 +562,9 @@ static void gpir_codegen(gpir_codegen_instr *code, gpir_instr *instr)
 static void gpir_codegen_print_prog(gpir_compiler *comp)
 {
    uint32_t *data = comp->prog->shader;
-   int size = comp->prog->shader_size;
-   int num_instr = size / sizeof(gpir_codegen_instr);
    int num_dword_per_instr = sizeof(gpir_codegen_instr) / sizeof(uint32_t);
 
-   for (int i = 0; i < num_instr; i++) {
+   for (int i = 0; i < comp->num_instr; i++) {
       printf("%03d: ", i);
       for (int j = 0; j < num_dword_per_instr; j++)
          printf("%08x ", data[i * num_dword_per_instr + j]);
@@ -582,11 +580,7 @@ bool gpir_codegen_prog(gpir_compiler *comp)
       num_instr += list_length(&block->instr_list);
    }
 
-   if (num_instr > 512) {
-      gpir_error("shader too big (%d), GP has a 512 instruction limit.\n",
-                 num_instr);
-      return false;
-   }
+   assert(num_instr <= 512);
 
    gpir_codegen_instr *code = rzalloc_array(comp->prog, gpir_codegen_instr, num_instr);
    if (!code)
@@ -607,7 +601,6 @@ bool gpir_codegen_prog(gpir_compiler *comp)
 
    comp->prog->shader = code;
    comp->prog->shader_size = num_instr * sizeof(gpir_codegen_instr);
-   comp->num_instr = num_instr;
 
    if (lima_debug & LIMA_DEBUG_GP) {
       gpir_codegen_print_prog(comp);
index 5cfb7e34a0274fddb1c63efdd1230ce1a0fa738a..a9a93290154dd3b6b40a0ecb508c069f4d6711b9 100644 (file)
@@ -34,6 +34,12 @@ gpir_instr *gpir_instr_create(gpir_block *block)
    if (unlikely(!instr))
       return NULL;
 
+   block->comp->num_instr++;
+   if (block->comp->num_instr > 512) {
+      gpir_error("shader exceeds limit of 512 instructions\n");
+      return NULL;
+   }
+
    instr->index = block->sched.instr_index++;
    instr->alu_num_slot_free = 6;
    instr->alu_non_cplx_slot_free = 5;