/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining -fsched-pressure" } */

struct s_linked_f_pointer
{
  struct s_linked_f_pointer *next;
  float *fptr;
};
struct s_trace
{
  int index;
};
struct s_rr_cost
{
  float base_cost;
  float acc_cost;
};
extern int num_nets;
extern struct s_trace **trace_head;
extern struct s_rr_cost *rr_cost;
struct s_rr_route
{
  float cost;
};
static int heap_tail;
extern struct s_linked_f_pointer *rr_modified_head;
extern struct s_rr_route *rr_route;

void
empty_heap (void)
{
  heap_tail = 1;
}

void
reset_path_costs (void)
{
  struct s_linked_f_pointer *mod_ptr;
  if (rr_modified_head != ((void *) 0))
    {
      mod_ptr = rr_modified_head;
      while (mod_ptr->next != ((void *) 0))
	{
	  *(mod_ptr->fptr) = 1.e30;
	  mod_ptr = mod_ptr->next;
	}
      rr_modified_head = ((void *) 0);
    }
}

static void
route_net (int inet)
{
  int i;
  for (i = 1; i < inet; i++)
    reset_path_costs ();
  empty_heap ();
  reset_path_costs ();
}

void
pathfinder_update_one_cost (int inet, float pres_fac, float acc_fac)
{
  struct s_trace *tptr;
  int inode = 0;

  tptr = trace_head[inet];
  inode = tptr->index;
  rr_route[inode].cost = rr_cost[inode].base_cost + rr_cost[inode].acc_cost;
}

int
try_route (int n, float x, float y)
{
  int inet, itry;
  float pres_fac;
  for (itry = 1; itry <= n; itry++)
    {
      for (inet = 0; inet < num_nets; inet++)
	{
	  route_net (inet);
	  pathfinder_update_one_cost (inet, pres_fac, x);
	}
      pres_fac *= y;
    }
}

