lima/ppir: clone ld_{uni,tex,var} into each block
authorVasily Khoruzhick <anarsoul@gmail.com>
Tue, 20 Aug 2019 03:20:12 +0000 (20:20 -0700)
committerVasily Khoruzhick <anarsoul@gmail.com>
Sat, 24 Aug 2019 01:19:46 +0000 (18:19 -0700)
ppir_lower_load() and ppir_lower_load_texture() assume that node
is in the same block as its successors, fix it by cloning each
ld_uni and ld_tex to every block.

It also reduces register pressure since values never cross block
boundaries and thus never appear in live_in or live_out of any block,
so do it for varyings as well.

Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
src/gallium/drivers/lima/ir/pp/lower.c
src/gallium/drivers/lima/ir/pp/nir.c
src/gallium/drivers/lima/ir/pp/node.c
src/gallium/drivers/lima/ir/pp/ppir.h

index bededd37acb6b828ba3f9399db9f8e9ca6a6a33d..15deed8dc33678afa5fe801fa8ce367b9a435b5c 100644 (file)
@@ -103,13 +103,18 @@ static bool ppir_lower_swap_args(ppir_block *block, ppir_node *node)
 
 static bool ppir_lower_load(ppir_block *block, ppir_node *node)
 {
+   ppir_dest *dest = ppir_node_get_dest(node);
+   if (ppir_node_is_root(node) && dest->type == ppir_target_ssa) {
+      ppir_node_delete(node);
+      return true;
+   }
+
    ppir_node *move = ppir_node_create(block, ppir_op_mov, -1 , 0);
    if (unlikely(!move))
       return false;
 
    ppir_alu_node *alu = ppir_node_to_alu(move);
 
-   ppir_dest *dest = ppir_node_get_dest(node);
    alu->dest = *dest;
 
    ppir_node_replace_all_succ(move, node);
index 3c0ff7dd93b5f73b6ad344821b9a8ef65c5d0e7c..5f2634833bc819557131d554da118a28d8cacdcd 100644 (file)
@@ -101,8 +101,22 @@ static void ppir_node_add_src(ppir_compiler *comp, ppir_node *node,
    if (ns->is_ssa) {
       child = comp->var_nodes[ns->ssa->index];
       /* Clone consts for each successor */
-      if (child->type == ppir_node_type_const)
-         child = ppir_node_clone_const(node->block, child);
+      switch (child->op) {
+      case ppir_op_const:
+         child = ppir_node_clone(node->block, child);
+         break;
+      /* Clone uniforms and load textures for each block */
+      case ppir_op_load_texture:
+      case ppir_op_load_uniform:
+      case ppir_op_load_varying:
+         if (child->block != node->block) {
+            child = ppir_node_clone(node->block, child);
+            comp->var_nodes[ns->ssa->index] = child;
+         }
+         break;
+      default:
+         break;
+      }
 
       ppir_node_add_dep(node, child);
    }
index 15479150448d311f681c1b075c010c5f8c8ec24d..1d4a0c9117421621acbabc190b00ab22a3ca4eb4 100644 (file)
@@ -572,7 +572,7 @@ void ppir_node_print_prog(ppir_compiler *comp)
    printf("====================\n");
 }
 
-ppir_node *ppir_node_clone_const(ppir_block *block, ppir_node *node)
+static ppir_node *ppir_node_clone_const(ppir_block *block, ppir_node *node)
 {
    ppir_const_node *cnode = ppir_node_to_const(node);
    ppir_const_node *new_cnode = ppir_node_create(block, ppir_op_const, -1, 0);
@@ -594,3 +594,82 @@ ppir_node *ppir_node_clone_const(ppir_block *block, ppir_node *node)
 
    return &new_cnode->node;
 }
+
+static ppir_node *
+ppir_node_clone_tex(ppir_block *block, ppir_node *node)
+{
+   ppir_load_texture_node *tex_node = ppir_node_to_load_texture(node);
+   ppir_load_texture_node *new_tnode = ppir_node_create(block, ppir_op_load_texture, -1, 0);
+
+   if (!new_tnode)
+      return NULL;
+
+   list_addtail(&new_tnode->node.list, &block->node_list);
+
+   ppir_dest *dest = ppir_node_get_dest(node);
+   new_tnode->dest = *dest;
+
+   new_tnode->sampler_dim = tex_node->sampler_dim;
+
+   for (int i = 0; i < 4; i++)
+      new_tnode->src_coords.swizzle[i] = tex_node->src_coords.swizzle[i];
+
+   for (int i = 0; i < ppir_node_get_src_num(node); i++) {
+      ppir_src *src = ppir_node_get_src(node, i);
+      ppir_src *new_src = ppir_node_get_src(&new_tnode->node, i);
+      switch (src->type) {
+      case ppir_target_ssa: {
+         ppir_node_target_assign(new_src, src->node);
+         ppir_node_add_dep(&new_tnode->node, src->node);
+         break;
+      }
+      case ppir_target_register: {
+         new_src->type = src->type;
+         new_src->reg = src->reg;
+         new_src->node = NULL;
+         break;
+      }
+      default:
+         /* pipeline is not expected here */
+         assert(0);
+      }
+   }
+
+   return &new_tnode->node;
+}
+
+static ppir_node *
+ppir_node_clone_load(ppir_block *block, ppir_node *node)
+{
+   ppir_load_node *load_node = ppir_node_to_load(node);
+   ppir_load_node *new_lnode = ppir_node_create(block, node->op, -1, 0);
+
+   if (!new_lnode)
+      return NULL;
+
+   list_addtail(&new_lnode->node.list, &block->node_list);
+
+   new_lnode->num_components = load_node->num_components;
+   new_lnode->index = load_node->index;
+
+   ppir_dest *dest = ppir_node_get_dest(node);
+   new_lnode->dest = *dest;
+
+   return &new_lnode->node;
+}
+
+ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
+{
+   switch (node->op) {
+   case ppir_op_const:
+      return ppir_node_clone_const(block, node);
+   case ppir_op_load_texture:
+      return ppir_node_clone_tex(block, node);
+   case ppir_op_load_uniform:
+   case ppir_op_load_varying:
+   case ppir_op_load_temp:
+      return ppir_node_clone_load(block, node);
+   default:
+      return NULL;
+   }
+}
index 3c21b6c8f294bc9cc50a153cd264b18a94e47b40..e94a1691ecbe8253e69631bad77249fdfc1f0d3e 100644 (file)
@@ -363,7 +363,7 @@ void ppir_node_print_prog(ppir_compiler *comp);
 void ppir_node_replace_child(ppir_node *parent, ppir_node *old_child, ppir_node *new_child);
 void ppir_node_replace_all_succ(ppir_node *dst, ppir_node *src);
 void ppir_node_replace_pred(ppir_dep *dep, ppir_node *new_pred);
-ppir_node *ppir_node_clone_const(ppir_block *block, ppir_node *node);
+ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node);
 
 static inline bool ppir_node_is_root(ppir_node *node)
 {