nir/spirv: Move CF emit code into vtn_cfg.c
[mesa.git] / src / glsl / opt_dead_code_local.cpp
index 88895fb0e8767eb04bbd95cfa83cf86ff75badcf..ee9f22c03733bdee356315940e49f75370ec9aa4 100644 (file)
@@ -70,9 +70,7 @@ public:
 
    void use_channels(ir_variable *const var, int used)
    {
-      foreach_list_safe(n, this->assignments) {
-        assignment_entry *entry = (assignment_entry *) n;
-
+      foreach_in_list_safe(assignment_entry, entry, this->assignments) {
         if (entry->lhs == var) {
            if (var->type->is_scalar() || var->type->is_vector()) {
               if (debug)
@@ -119,8 +117,7 @@ public:
       /* For the purpose of dead code elimination, emitting a vertex counts as
        * "reading" all of the currently assigned output variables.
        */
-      foreach_list_safe(n, this->assignments) {
-         assignment_entry *entry = (assignment_entry *) n;
+      foreach_in_list_safe(assignment_entry, entry, this->assignments) {
          if (entry->lhs->data.mode == ir_var_shader_out) {
             if (debug)
                printf("kill %s\n", entry->lhs->name);
@@ -196,12 +193,15 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
            printf("looking for %s.0x%01x to remove\n", var->name,
                   ir->write_mask);
 
-        foreach_list_safe(n, assignments) {
-           assignment_entry *entry = (assignment_entry *) n;
-
+        foreach_in_list_safe(assignment_entry, entry, assignments) {
            if (entry->lhs != var)
               continue;
 
+            /* Skip if the assignment we're trying to eliminate isn't a plain
+             * variable deref. */
+            if (entry->ir->lhs->ir_type != ir_type_dereference_variable)
+               continue;
+
            int remove = entry->unused & ir->write_mask;
            if (debug) {
               printf("%s 0x%01x - 0x%01x = 0x%01x\n",
@@ -258,9 +258,7 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
          */
         if (debug)
            printf("looking for %s to remove\n", var->name);
-        foreach_list_safe(n, assignments) {
-           assignment_entry *entry = (assignment_entry *) n;
-
+        foreach_in_list_safe(assignment_entry, entry, assignments) {
            if (entry->lhs == var) {
               if (debug)
                  printf("removing %s\n", var->name);
@@ -280,9 +278,7 @@ process_assignment(void *ctx, ir_assignment *ir, exec_list *assignments)
       printf("add %s\n", var->name);
 
       printf("current entries\n");
-      foreach_list(n, assignments) {
-        assignment_entry *entry = (assignment_entry *) n;
-
+      foreach_in_list(assignment_entry, entry, assignments) {
         printf("    %s (0x%01x)\n", entry->lhs->name, entry->unused);
       }
    }