lima/ppir: handle all node types in ppir_node_replace_child
authorErico Nunes <nunes.erico@gmail.com>
Tue, 16 Jul 2019 23:31:01 +0000 (01:31 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Fri, 19 Jul 2019 16:01:45 +0000 (16:01 +0000)
ppir_node_replace_child is used by the const lowering routine in ppir.
All types need to be handled here, otherwise the src node is not updated
properly when one of the lowered nodes is a const, which results in, for
example, regalloc not assigning registers correctly.

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

index 280e08e9e2d6c5964ca4a0fe0a9803aadec86384..841303b8a867b9b378a28ec7a752d30a74014c1b 100644 (file)
@@ -394,14 +394,42 @@ static void _ppir_node_replace_child(ppir_src *src, ppir_node *old_child, ppir_n
 
 void ppir_node_replace_child(ppir_node *parent, ppir_node *old_child, ppir_node *new_child)
 {
-   if (parent->type == ppir_node_type_alu) {
+   switch (parent->type) {
+   case ppir_node_type_alu:
+   {
       ppir_alu_node *alu = ppir_node_to_alu(parent);
       for (int i = 0; i < alu->num_src; i++)
          _ppir_node_replace_child(alu->src + i, old_child, new_child);
+      break;
    }
-   else if (parent->type == ppir_node_type_store) {
+   case ppir_node_type_branch:
+   {
+      ppir_branch_node *branch = ppir_node_to_branch(parent);
+      for (int i = 0; i < 2; i++)
+         _ppir_node_replace_child(branch->src + i, old_child, new_child);
+      break;
+   }
+   case ppir_node_type_load:
+   {
+      ppir_load_node *load = ppir_node_to_load(parent);
+      _ppir_node_replace_child(&load->src, old_child, new_child);
+      break;
+   }
+   case ppir_node_type_load_texture:
+   {
+      ppir_load_texture_node *load_texture = ppir_node_to_load_texture(parent);
+      _ppir_node_replace_child(&load_texture->src_coords, old_child, new_child);
+      break;
+   }
+   case ppir_node_type_store:
+   {
       ppir_store_node *store = ppir_node_to_store(parent);
       _ppir_node_replace_child(&store->src, old_child, new_child);
+      break;
+   }
+   default:
+      ppir_debug("unknown node type in %s\n", __func__);
+      break;
    }
 }