static bool loop_is_dead(nir_loop *loop) { nir_block *before = nir_cf_node_as_block(nir_cf_node_prev(&loop->cf_node)); nir_block *after = nir_cf_node_as_block(nir_cf_node_next(&loop->cf_node)); if (!exec_list_is_empty(&after->instr_list) && nir_block_first_instr(after)->type == nir_instr_type_phi) return false; if (!nir_foreach_block_in_cf_node(&loop->cf_node, block_has_no_side_effects, NULL)) return false; nir_function_impl *impl = nir_cf_node_get_function(&loop->cf_node); nir_metadata_require(impl, nir_metadata_live_variables | nir_metadata_dominance); for (nir_block *cur = after->imm_dom; cur != before; cur = cur->imm_dom) { nir_foreach_instr(cur, instr) { if (!nir_foreach_ssa_def(instr, def_not_live_out, after)) return false; } } return true; }
static bool nir_lower_locals_to_regs_impl(nir_function_impl *impl) { struct locals_to_regs_state state; nir_builder_init(&state.builder, impl); state.progress = false; state.regs_table = _mesa_hash_table_create(NULL, hash_deref, derefs_equal); nir_metadata_require(impl, nir_metadata_dominance); nir_foreach_block(block, impl) { lower_locals_to_regs_block(block, &state); }
static bool nir_opt_cse_impl(nir_function_impl *impl) { struct set *instr_set = nir_instr_set_create(NULL); nir_metadata_require(impl, nir_metadata_dominance); bool progress = cse_block(nir_start_block(impl), instr_set); if (progress) nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); nir_instr_set_destroy(instr_set); return progress; }