diff options
author | Sergey Grechanik <mouseentity@ispras.ru> | 2011-08-11 11:50:27 +0000 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2011-08-11 15:50:27 +0400 |
commit | 0d9439b07cce79ee8e822481f75331dc70399826 (patch) | |
tree | cbe8ad3a6a9c34b18d7bef9e1bef3a4bef007976 | |
parent | 5c416724e03238da11ea0d37e029ccd25824fa18 (diff) | |
download | gcc-0d9439b07cce79ee8e822481f75331dc70399826.zip gcc-0d9439b07cce79ee8e822481f75331dc70399826.tar.gz gcc-0d9439b07cce79ee8e822481f75331dc70399826.tar.bz2 |
sel-sched-ir.c (get_seqno_of_a_pred): Rename to get_seqno_for_a_jump.
2011-08-11 Sergey Grechanik <mouseentity@ispras.ru>
* sel-sched-ir.c (get_seqno_of_a_pred): Rename to
get_seqno_for_a_jump. Update the caller.
(get_seqno_by_succs): New. Use it ...
(get_seqno_for_a_jump): ... here to find a seqno if looking at
predecessors was not sufficient.
(get_seqno_by_preds): Include head in iteration range, exclude insn.
From-SVN: r177656
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 57 |
2 files changed, 58 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 322e85e..50c9378 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-08-11 Sergey Grechanik <mouseentity@ispras.ru> + + * sel-sched-ir.c (get_seqno_of_a_pred): Rename to + get_seqno_for_a_jump. Update the caller. + (get_seqno_by_succs): New. Use it ... + (get_seqno_for_a_jump): ... here to find a seqno if looking at + predecessors was not sufficient. + (get_seqno_by_preds): Include head in iteration range, exclude insn. + 2011-08-11 Dmitry Melnik <dm@ispras.ru> * sel-sched-ir.c (invalidate_av_set): Remove the assert. diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 4fa2837..c7e365a 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3940,9 +3940,39 @@ sel_luid_for_non_insn (rtx x) return -1; } -/* Return seqno of the only predecessor of INSN. */ +/* Find the proper seqno for inserting at INSN by successors. + Return -1 if no successors with positive seqno exist. */ static int -get_seqno_of_a_pred (insn_t insn) +get_seqno_by_succs (rtx insn) +{ + basic_block bb = BLOCK_FOR_INSN (insn); + rtx tmp = insn, end = BB_END (bb); + int seqno; + insn_t succ = NULL; + succ_iterator si; + + while (tmp != end) + { + tmp = NEXT_INSN (tmp); + if (INSN_P (tmp)) + return INSN_SEQNO (tmp); + } + + seqno = INT_MAX; + + FOR_EACH_SUCC_1 (succ, si, end, SUCCS_NORMAL) + if (INSN_SEQNO (succ) > 0) + seqno = MIN (seqno, INSN_SEQNO (succ)); + + if (seqno == INT_MAX) + return -1; + + return seqno; +} + +/* Compute seqno for INSN by its preds or succs. */ +static int +get_seqno_for_a_jump (insn_t insn) { int seqno; @@ -3982,14 +4012,24 @@ get_seqno_of_a_pred (insn_t insn) int n; cfg_preds (BLOCK_FOR_INSN (insn), &preds, &n); - gcc_assert (n == 1); - seqno = INSN_SEQNO (preds[0]); + gcc_assert (n > 0); + /* For one predecessor, use simple method. */ + if (n == 1) + seqno = INSN_SEQNO (preds[0]); + else + seqno = get_seqno_by_preds (insn); free (preds); } } + /* We were unable to find a good seqno among preds. */ + if (seqno < 0) + seqno = get_seqno_by_succs (insn); + + gcc_assert (seqno >= 0); + return seqno; } @@ -4004,10 +4044,11 @@ get_seqno_by_preds (rtx insn) int n, i, seqno; while (tmp != head) - if (INSN_P (tmp)) - return INSN_SEQNO (tmp); - else + { tmp = PREV_INSN (tmp); + if (INSN_P (tmp)) + return INSN_SEQNO (tmp); + } cfg_preds (bb, &preds, &n); for (i = 0, seqno = -1; i < n; i++) @@ -4179,7 +4220,7 @@ init_simplejump_data (insn_t insn) init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0, REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0, NULL, true, false, false, false, true); - INSN_SEQNO (insn) = get_seqno_of_a_pred (insn); + INSN_SEQNO (insn) = get_seqno_for_a_jump (insn); init_first_time_insn_data (insn); } |