lima/ppir: branch regalloc fixes
authorErico Nunes <nunes.erico@gmail.com>
Tue, 16 Jul 2019 23:30:55 +0000 (01:30 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Fri, 19 Jul 2019 16:01:45 +0000 (16:01 +0000)
The branch instruction has sources which must be handled in src handling
paths so that regalloc assigns registers to them properly.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
src/gallium/drivers/lima/ir/pp/regalloc.c

index dee530ca2b674f9902a61f5fd19bdf05a50042a8..62401150e3e6ce87af745dbd2d36e636867e4608 100644 (file)
@@ -239,6 +239,16 @@ static ppir_reg *ppir_regalloc_build_liveness_info(ppir_compiler *comp)
                reg->live_out = node->instr->seq;
             break;
          }
+         case ppir_node_type_branch:
+         {
+            ppir_branch_node *branch = ppir_node_to_branch(node);
+            for (int i = 0; i < 2; i++) {
+               ppir_reg *reg = get_src_reg(branch->src + i);
+               if (reg && node->instr->seq > reg->live_out)
+                  reg->live_out = node->instr->seq;
+            }
+            break;
+         }
          default:
             break;
          }
@@ -315,6 +325,17 @@ static void ppir_regalloc_print_result(ppir_compiler *comp)
                printf("%d", ppir_target_get_src_reg_index(&load_tex->src_coords));
                break;
             }
+            case ppir_node_type_branch:
+            {
+               ppir_branch_node *branch = ppir_node_to_branch(node);
+               for (int j = 0; j < 2; j++) {
+                  if (j)
+                     printf(" ");
+
+                  printf("%d", ppir_target_get_src_reg_index(branch->src + j));
+               }
+               break;
+            }
             default:
                break;
             }
@@ -610,6 +631,18 @@ static bool ppir_regalloc_spill_reg(ppir_compiler *comp, ppir_reg *chosen)
             }
             break;
          }
+         case ppir_node_type_branch:
+         {
+            ppir_branch_node *branch = ppir_node_to_branch(node);
+            for (int i = 0; i < 2; i++) {
+               reg = get_src_reg(branch->src + i);
+               if (reg == chosen) {
+                  ppir_update_spilled_src(comp, block, node,
+                                          branch->src + i, NULL);
+               }
+            }
+            break;
+         }
          default:
             break;
          }