summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/lima/ir/pp/node.c
diff options
context:
space:
mode:
authorErico Nunes <nunes.erico@gmail.com>2020-01-12 14:30:26 +0100
committerMarge Bot <eric+marge@anholt.net>2020-01-15 22:55:31 +0000
commit7e2765fded33ed13693939b0e4ef94943fedf2cb (patch)
tree4d36e3a7d67fa2f5ff0662254e8a7c1ccda4cf61 /src/gallium/drivers/lima/ir/pp/node.c
parenta3a73d116c1425d1d2da2f3b3aabe06a53c3d800 (diff)
downloadmesa-7e2765fded33ed13693939b0e4ef94943fedf2cb.tar.gz
lima/ppir: remove orphan load node after cloning
There are some cases in shades using control flow where the varying load is cloned to every block, and then the original node is left orphan. This is not harmful for program execution, but it complicates analysis for register allocation as there is now a case of writing to a register that is never read. While ppir doesn't have a dead code elimination pass for its own optimizations and it is not hard to detect when we cloned the last load, let's remove it early. Signed-off-by: Erico Nunes <nunes.erico@gmail.com> Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3358>
Diffstat (limited to 'src/gallium/drivers/lima/ir/pp/node.c')
-rw-r--r--src/gallium/drivers/lima/ir/pp/node.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/gallium/drivers/lima/ir/pp/node.c b/src/gallium/drivers/lima/ir/pp/node.c
index a5748a22200..bf713f80715 100644
--- a/src/gallium/drivers/lima/ir/pp/node.c
+++ b/src/gallium/drivers/lima/ir/pp/node.c
@@ -669,6 +669,27 @@ ppir_node_clone_load(ppir_block *block, ppir_node *node)
return &new_lnode->node;
}
+void
+ppir_delete_if_orphan(ppir_block *block, ppir_node *node)
+{
+ ppir_dest *dest = ppir_node_get_dest(node);
+ if (!dest)
+ return;
+
+ ppir_node_foreach_succ_safe(node, dep) {
+ ppir_node *succ = dep->succ;
+ for (int i = 0; i < ppir_node_get_src_num(succ); i++) {
+ ppir_src *src = ppir_node_get_src(succ, i);
+ if (!src)
+ continue;
+ if (ppir_node_target_equal(src, dest))
+ return;
+ }
+ }
+
+ ppir_node_delete(node);
+}
+
ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
{
switch (node->op) {