diff options
author | Andrey Belevantsev <abel@gcc.gnu.org> | 2010-01-14 14:07:39 +0300 |
---|---|---|
committer | Andrey Belevantsev <abel@gcc.gnu.org> | 2010-01-14 14:07:39 +0300 |
commit | 136e01a3a9df48f5edc19e5b46c9c418a7fdd8f5 (patch) | |
tree | 417364ab83b0b9a615900c90101e61adef6bf7cb /gcc/testsuite/gcc.dg/pr42389.c | |
parent | 762bffbac19855194ddcf644c332cee01be701be (diff) | |
download | gcc-136e01a3a9df48f5edc19e5b46c9c418a7fdd8f5.tar.gz |
re PR rtl-optimization/42389 (ICE in advance_state_on_fence with sel-schd for 175.vpr)
PR rtl-optimization/42389
* sel-sched.c (advance_one_cycle): Set FENCE_ISSUE_MORE
to can_issue_more.
(advance_state_on_fence): Likewise.
(sel_target_adjust_priority): Print debug output only when
sched_verbose >= 4, not 2.
(get_expr_cost): Do not issue all unique insns on the next cycle.
(fill_insns): Initialize can_issue_more from the value saved
with the fence.
* sel-sched-ir.c (flist_add): New parameter issue_more.
Init FENCE_ISSUE_MORE with it.
(merge_fences): Likewise.
(init_fences): Update call to flist_add.
(add_to_fences, add_clean_fence_to_fences)
(add_dirty_fence_to_fences): Likewise.
(move_fence_to_fences): Update call to merge_fences.
(invoke_reorder_hooks): Do not reset can_issue_more on insns from
sched groups.
* sel-sched-ir.h (struct _fence): New field issue_more.
(FENCE_ISSUE_MORE): New accessor macro.
From-SVN: r155895
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 00000000000..c398012f2b4 --- /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; + } +} + |