+
+ /* Propagate defin and defout down the CFG to calculate the union of live
+ * variables potentially defined along any possible control flow path.
+ */
+ do {
+ cont = false;
+
+ foreach_block (block, cfg) {
+ const struct block_data *bd = &block_data[block->num];
+
+ foreach_list_typed(bblock_link, child_link, link, &block->children) {
+ struct block_data *child_bd = &block_data[child_link->block->num];
+
+ for (int i = 0; i < bitset_words; i++) {
+ const BITSET_WORD new_def = bd->defout[i] & ~child_bd->defin[i];
+ child_bd->defin[i] |= new_def;
+ child_bd->defout[i] |= new_def;
+ cont |= new_def;
+ }
+ }
+ }
+ } while (cont);