i965/fs: Fix computation of livein.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 10 Aug 2013 01:44:25 +0000 (18:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 19 Aug 2013 18:29:24 +0000 (11:29 -0700)
Since the initial value for livein is an overestimation (0xffffffff),
it's extremely likely that it will shrink, which means we can't simply
OR in new bits - we need to fully recompute it based on the current
liveout values.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 90a3f4fbc0c0678959623667f01a6b25fa400ee7..5ea8ea574ff6fbcbbbb3113caf917a5b3b3827d5 100644 (file)
@@ -227,18 +227,17 @@ fs_copy_prop_dataflow::run()
             continue;
 
          for (int i = 0; i < bitset_words; i++) {
-            BITSET_WORD new_livein = ~bd[b].livein[i];
+            const BITSET_WORD old_livein = bd[b].livein[i];
+
+            bd[b].livein[i] = ~0u;
             foreach_list(block_node, &cfg->blocks[b]->parents) {
                bblock_link *link = (bblock_link *)block_node;
                bblock_t *block = link->block;
-               new_livein &= bd[block->block_num].liveout[i];
-               if (!new_livein)
-                  break;
+               bd[b].livein[i] &= bd[block->block_num].liveout[i];
             }
-            if (new_livein) {
-               bd[b].livein[i] |= new_livein;
+
+            if (old_livein != bd[b].livein[i])
                progress = true;
-            }
          }
       }
    } while (progress);