Ejemplo n.º 1
0
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);
   }
Ejemplo n.º 3
0
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;
}