Exemplo n.º 1
0
//------------------------------remove_dead------------------------------------
// Recursively kill a dead Node.
void Block::remove_dead( Node *dead ) {
  // Smash all inputs to 'dead', isolating him completely
  for( uint i = 0; i < dead->req(); i++ ) {
    Node *in = dead->in(i);
    if( in ) {                 // Points to something?
      dead->set_req(i,NULL);   // Kill the edge
      if( in->outcnt() == 0 ) {// Made input go dead?
	remove_dead(in);       // Recursively remove
      }
    }
  }
}
Exemplo n.º 2
0
/* Does all known instruction optimizations */
void
cuc_optimize (cuc_func * func)
{
  int modified = 0;
  int first = 1;
  log ("Optimizing.\n");
  do
    {
      modified = 0;
      clean_deps (func);
      if (cuc_debug >= 6)
	print_cuc_bb (func, "AFTER_CLEAN_DEPS");
      if (optimize_cmovs (func))
	{
	  if (cuc_debug >= 6)
	    print_cuc_bb (func, "AFTER_OPT_CMOVS");
	  modified = 1;
	}
      if (cuc_debug)
	cuc_check (func);
      if (optimize_tree (func))
	{
	  if (cuc_debug >= 6)
	    print_cuc_bb (func, "AFTER_OPT_TREE1");
	  modified = 1;
	}
      if (remove_nops (func))
	{
	  if (cuc_debug >= 6)
	    print_cuc_bb (func, "NO_NOPS");
	  modified = 1;
	}
      if (cuc_debug)
	cuc_check (func);
      if (remove_dead (func))
	{
	  if (cuc_debug >= 5)
	    print_cuc_bb (func, "AFTER_DEAD");
	  modified = 1;
	}
      if (cuc_debug)
	cuc_check (func);
      if (cse (func))
	{
	  log ("Common subexpression elimination.\n");
	  if (cuc_debug >= 3)
	    print_cuc_bb (func, "AFTER_CSE");
	  modified = 1;
	}
      if (first)
	{
	  insert_conditional_facts (func);
	  if (cuc_debug >= 3)
	    print_cuc_bb (func, "AFTER_COND_FACT");
	  if (cuc_debug)
	    cuc_check (func);
	  first = 0;
	}
      if (optimize_bb (func))
	{
	  if (cuc_debug >= 5)
	    print_cuc_bb (func, "AFTER_OPT_BB");
	  modified = 1;
	}
      if (cuc_debug)
	cuc_check (func);
      if (remove_nops (func))
	{
	  if (cuc_debug >= 6)
	    print_cuc_bb (func, "NO_NOPS");
	  modified = 1;
	}
      if (remove_dead_bb (func))
	{
	  if (cuc_debug >= 5)
	    print_cuc_bb (func, "AFTER_DEAD_BB");
	  modified = 1;
	}
      if (remove_trivial_regs (func))
	{
	  if (cuc_debug >= 2)
	    print_cuc_bb (func, "AFTER_TRIVIAL");
	  modified = 1;
	}
      if (remove_nops (func))
	{
	  if (cuc_debug >= 6)
	    print_cuc_bb (func, "NO_NOPS");
	  modified = 1;
	}
      add_memory_dep (func, func->memory_order);
      if (cuc_debug >= 7)
	print_cuc_bb (func, "AFTER_MEMORY_DEP");
      add_data_dep (func);
      if (cuc_debug >= 8)
	print_cuc_bb (func, "AFTER_DATA_DEP");
      if (schedule_memory (func, func->memory_order))
	{
	  if (cuc_debug >= 7)
	    print_cuc_bb (func, "AFTER_SCHEDULE_MEM");
	  modified = 1;
	}
    }
  while (modified);
  set_io (func);
#if 0
  detect_max_values (func);
  if (cuc_debug >= 5)
    print_cuc_bb (func, "AFTER_MAX_VALUES");
#endif
}