diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2007-12-27 14:48:20 +0000 |
---|---|---|
committer | Andrey Belevantsev <abel@ispras.ru> | 2007-12-27 14:48:20 +0000 |
commit | 4f5293621cacd51ee6014ed513b95a2a55b65d26 (patch) | |
tree | 7b8dd25fa2df4b304f3636191fc23394722b844f | |
parent | 40c313bd0b07945f33351d0a2b0312a7f5f2d1bb (diff) |
2007-12-27 Andrey Belevantsev <abel@ispras.ru>
* sel-sched.c (sel_rank_for_schedule): Tidy.
(fill_vec_av_set): Use VEC_unordered_remove instead of ordered.
Properly calculate is_orig_reg_p. Add the final qsort call
after filtering out the av set.
* sched-rgn.c (sched_rgn_init): With selective scheduling,
always try to compute ebb regions instead of single block reagions.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/sel-sched-branch@131203 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.sel-sched | 9 | ||||
-rw-r--r-- | gcc/sched-rgn.c | 2 | ||||
-rw-r--r-- | gcc/sel-sched.c | 22 |
3 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog.sel-sched b/gcc/ChangeLog.sel-sched index a536bb85beb..0986e66c99c 100644 --- a/gcc/ChangeLog.sel-sched +++ b/gcc/ChangeLog.sel-sched @@ -1,5 +1,14 @@ 2007-12-27 Andrey Belevantsev <abel@ispras.ru> + * sel-sched.c (sel_rank_for_schedule): Tidy. + (fill_vec_av_set): Use VEC_unordered_remove instead of ordered. + Properly calculate is_orig_reg_p. Add the final qsort call + after filtering out the av set. + * sched-rgn.c (sched_rgn_init): With selective scheduling, + always try to compute ebb regions instead of single block reagions. + +2007-12-27 Andrey Belevantsev <abel@ispras.ru> + Cache that an expression can be moved up only as RHS. * sel-sched.c (enum MOVEUP_RHS_CODE): New value MOVEUP_RHS_AS_RHS. diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c index ff8b4be75a2..9f379c0880c 100644 --- a/gcc/sched-rgn.c +++ b/gcc/sched-rgn.c @@ -2913,7 +2913,7 @@ sched_rgn_init (bool single_blocks_p, bool ebbs_p) || !flag_schedule_interblock || is_cfg_nonregular ()) { - find_single_block_region (ebbs_p); + find_single_block_region (SEL_SCHED_P ? true : ebbs_p); } else { diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index b1d43cc592f..ef2c9377ced 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -2960,6 +2960,7 @@ sel_rank_for_schedule (const void *x, const void *y) { if (VINSN_UNIQUE_P (tmp_vinsn) && VINSN_UNIQUE_P (tmp2_vinsn)) return SCHED_GROUP_P (tmp2_insn) ? 1 : -1; + /* Now uniqueness means SCHED_GROUP_P is set, because schedule groups cannot be cloned. */ if (VINSN_UNIQUE_P (tmp2_vinsn)) @@ -3312,7 +3313,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) /* Don't allow any insns other than from SCHED_GROUP if we have one. */ if (FENCE_SCHED_NEXT (fence) && insn != FENCE_SCHED_NEXT (fence)) { - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); continue; } @@ -3328,8 +3329,11 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) target_available = EXPR_TARGET_AVAILABLE (rhs); if (target_available == true) - /* Do nothing -- we can use an existing register. */ - succ++; + { + /* Do nothing -- we can use an existing register. */ + succ++; + is_orig_reg_p = EXPR_SEPARABLE_P (rhs); + } else if (/* Non-separable instruction will never get another register. */ (target_available == false @@ -3338,7 +3342,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) || n >= max_insns_to_rename) { succ++; - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); print ("- no register; "); continue; } @@ -3349,7 +3353,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) not available in separable RHS. Do it the hard way. */ ! find_best_reg_for_rhs (rhs, bnds, &is_orig_reg_p)) { - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); print ("- no register; "); continue; } @@ -3369,11 +3373,11 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) /* We need to know whether we do need to stall for any insns. */ stalled++; print ("- not ready yet; "); - VEC_ordered_remove (rhs_t, vec_av_set, n); + VEC_unordered_remove (rhs_t, vec_av_set, n); continue; } - print ("; "); + print (" - ok; "); n++; } @@ -3396,6 +3400,10 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence) return false; } + /* Sort the vector. */ + qsort (VEC_address (rhs_t, vec_av_set), VEC_length (rhs_t, vec_av_set), + sizeof (rhs_t), sel_rank_for_schedule); + line_start (); print ("Sorted av set (%d): ", VEC_length (rhs_t, vec_av_set)); |