unsigned num_ssa_defs;
unsigned bitset_words;
+ /* Used in propagate_across_edge() */
+ BITSET_WORD *tmp_live;
+
nir_block_worklist worklist;
};
propagate_across_edge(nir_block *pred, nir_block *succ,
struct live_ssa_defs_state *state)
{
- NIR_VLA(BITSET_WORD, live, state->bitset_words);
+ BITSET_WORD *live = state->tmp_live;
memcpy(live, succ->live_in, state->bitset_words * sizeof *live);
nir_foreach_instr(instr, succ) {
break;
nir_phi_instr *phi = nir_instr_as_phi(instr);
- nir_foreach_phi_src(phi, src) {
+ nir_foreach_phi_src(src, phi) {
if (src->pred == pred) {
set_src_live(&src->src, live);
break;
* blocks to the worklist.
*/
state.bitset_words = BITSET_WORDS(state.num_ssa_defs);
+ state.tmp_live = rzalloc_array(impl, BITSET_WORD, state.bitset_words);
nir_foreach_block(block, impl) {
init_liveness_block(block, &state);
}
* changed, add the predecessor to the work list so that we ensure
* that the new information is used.
*/
- struct set_entry *entry;
set_foreach(block->predecessors, entry) {
nir_block *pred = (nir_block *)entry->key;
if (propagate_across_edge(pred, block, &state))
}
}
+ ralloc_free(state.tmp_live);
nir_block_worklist_fini(&state.worklist);
}