| /* { dg-do compile { target powerpc*-*-* ia64-*-* 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; |
| } |
| } |
| |