}
}
}
+ if (inst->reads_flag()) {
+ if (!BITSET_TEST(bd->flag_def, 0)) {
+ BITSET_SET(bd->flag_use, 0);
+ }
+ }
/* Check for unconditional writes to whole registers. These
* are the things that screen off preceding definitions of a
}
}
}
+ if (inst->writes_flag()) {
+ if (!BITSET_TEST(bd->flag_use, 0)) {
+ BITSET_SET(bd->flag_def, 0);
+ }
+ }
ip++;
}
cont = true;
}
}
+ BITSET_WORD new_livein = (bd->flag_use[0] |
+ (bd->flag_liveout[0] &
+ ~bd->flag_def[0]));
+ if (new_livein & ~bd->flag_livein[0]) {
+ bd->flag_livein[0] |= new_livein;
+ cont = true;
+ }
/* Update liveout */
foreach_list_typed(bblock_link, child_link, link, &block->children) {
cont = true;
}
}
+ BITSET_WORD new_liveout = (child_bd->flag_livein[0] &
+ ~bd->flag_liveout[0]);
+ if (new_liveout) {
+ bd->flag_liveout[0] |= new_liveout;
+ cont = true;
+ }
}
}
}
block_data[i].use = rzalloc_array(mem_ctx, BITSET_WORD, bitset_words);
block_data[i].livein = rzalloc_array(mem_ctx, BITSET_WORD, bitset_words);
block_data[i].liveout = rzalloc_array(mem_ctx, BITSET_WORD, bitset_words);
+
+ block_data[i].flag_def[0] = 0;
+ block_data[i].flag_use[0] = 0;
+ block_data[i].flag_livein[0] = 0;
+ block_data[i].flag_liveout[0] = 0;
}
setup_def_use();
/** Which defs reach the exit point of the block. */
BITSET_WORD *liveout;
+
+ BITSET_WORD flag_def[1];
+ BITSET_WORD flag_use[1];
+ BITSET_WORD flag_livein[1];
+ BITSET_WORD flag_liveout[1];
};
class vec4_live_variables {