diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr42389.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr42389.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr42389.c b/gcc/testsuite/gcc.dg/pr42389.c new file mode 100644 index 000000000..c398012f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42389.c @@ -0,0 +1,87 @@ +/* { 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; + } +} + |