diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-13 20:22:07 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-13 20:22:07 +0000 |
commit | 1c18ed1975785cd97ed4c363b0d7528474a5e5ba (patch) | |
tree | 65baa180a86b2d42af9b66e92cc76a26e4c508b9 | |
parent | 34a602f033288c158d967dcf06ed9950acb4c750 (diff) | |
download | gcc-1c18ed1975785cd97ed4c363b0d7528474a5e5ba.tar.gz |
PR rtl-optimization/54871
* loop-iv.c (simplify_using_initial_values): When scanning previous
basic blocks, prune the recorded conditions if the current insn was
not used to make a replacement.
* loop-unroll.c (decide_unroll_constant_iterations): Clean up message.
(unroll_loop_constant_iterations): Clarify head comment.
(decide_unroll_runtime_iterations): Clean up message.
(unroll_loop_runtime_iterations): Clarify head comment.
(decide_peel_simple): Clean up message.
(peel_loop_simple): Clarify head comment.
(decide_unroll_stupid): Clean up message.
(unroll_loop_stupid): Clarify head comment.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192426 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/loop-iv.c | 29 | ||||
-rw-r--r-- | gcc/loop-unroll.c | 46 |
3 files changed, 61 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f961a99aa5a..d80612418b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2012-10-13 Eric Botcazou <ebotcazou@adacore.com> + + PR rtl-optimization/54871 + * loop-iv.c (simplify_using_initial_values): When scanning previous + basic blocks, prune the recorded conditions if the current insn was + not used to make a replacement. + + * loop-unroll.c (decide_unroll_constant_iterations): Clean up message. + (unroll_loop_constant_iterations): Clarify head comment. + (decide_unroll_runtime_iterations): Clean up message. + (unroll_loop_runtime_iterations): Clarify head comment. + (decide_peel_simple): Clean up message. + (peel_loop_simple): Clarify head comment. + (decide_unroll_stupid): Clean up message. + (unroll_loop_stupid): Clarify head comment. + 2012-10-13 Andreas Schwab <schwab@linux-m68k.org> PR gcov-profile/44728 diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index f1e19d82072..4619c626b7b 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -2004,11 +2004,30 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr) } } else - /* If we did not use this insn to make a replacement, any overlap - between stores in this insn and our expression will cause the - expression to become invalid. */ - if (for_each_rtx (expr, altered_reg_used, this_altered)) - goto out; + { + rtx *pnote, *pnote_next; + + /* If we did not use this insn to make a replacement, any overlap + between stores in this insn and our expression will cause the + expression to become invalid. */ + if (for_each_rtx (expr, altered_reg_used, this_altered)) + goto out; + + /* Likewise for the conditions. */ + for (pnote = &cond_list; *pnote; pnote = pnote_next) + { + rtx note = *pnote; + rtx old_cond = XEXP (note, 0); + + pnote_next = &XEXP (note, 1); + if (for_each_rtx (&old_cond, altered_reg_used, this_altered)) + { + *pnote = *pnote_next; + pnote_next = pnote; + free_EXPR_LIST_node (note); + } + } + } if (CONSTANT_P (*expr)) goto out; diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index b6dace030c1..5350ee08815 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -602,26 +602,21 @@ decide_unroll_constant_iterations (struct loop *loop, int flags) } } - if (dump_file) - fprintf (dump_file, ";; max_unroll %d (%d copies, initial %d).\n", - best_unroll + 1, best_copies, nunroll); - loop->lpt_decision.decision = LPT_UNROLL_CONSTANT; loop->lpt_decision.times = best_unroll; if (dump_file) - fprintf (dump_file, - ";; Decided to unroll the constant times rolling loop, %d times.\n", - loop->lpt_decision.times); + fprintf (dump_file, ";; Decided to unroll the loop %d times (%d copies).\n", + loop->lpt_decision.times, best_copies); } -/* Unroll LOOP with constant number of iterations LOOP->LPT_DECISION.TIMES + 1 - times. The transformation does this: +/* Unroll LOOP with constant number of iterations LOOP->LPT_DECISION.TIMES times. + The transformation does this: for (i = 0; i < 102; i++) body; - ==> + ==> (LOOP->LPT_DECISION.TIMES == 3) i = 0; body; i++; @@ -671,7 +666,7 @@ unroll_loop_constant_iterations (struct loop *loop) of exit condition have continuous body after unrolling. */ if (dump_file) - fprintf (dump_file, ";; Condition on beginning of loop.\n"); + fprintf (dump_file, ";; Condition at beginning of loop.\n"); /* Peel exit_mod iterations. */ RESET_BIT (wont_exit, 0); @@ -713,7 +708,7 @@ unroll_loop_constant_iterations (struct loop *loop) the loop tests the condition at the end of loop body. */ if (dump_file) - fprintf (dump_file, ";; Condition on end of loop.\n"); + fprintf (dump_file, ";; Condition at end of loop.\n"); /* We know that niter >= max_unroll + 2; so we do not need to care of case when we would exit before reaching the loop. So just peel @@ -896,9 +891,7 @@ decide_unroll_runtime_iterations (struct loop *loop, int flags) loop->lpt_decision.times = i - 1; if (dump_file) - fprintf (dump_file, - ";; Decided to unroll the runtime computable " - "times rolling loop, %d times.\n", + fprintf (dump_file, ";; Decided to unroll the loop %d times.\n", loop->lpt_decision.times); } @@ -949,14 +942,14 @@ split_edge_and_insert (edge e, rtx insns) return bb; } -/* Unroll LOOP for that we are able to count number of iterations in runtime - LOOP->LPT_DECISION.TIMES + 1 times. The transformation does this (with some +/* Unroll LOOP for which we are able to count number of iterations in runtime + LOOP->LPT_DECISION.TIMES times. The transformation does this (with some extra care for case n < 0): for (i = 0; i < n; i++) body; - ==> + ==> (LOOP->LPT_DECISION.TIMES == 3) i = 0; mod = n % 4; @@ -1314,20 +1307,23 @@ decide_peel_simple (struct loop *loop, int flags) loop->lpt_decision.times = npeel; if (dump_file) - fprintf (dump_file, ";; Decided to simply peel the loop, %d times.\n", + fprintf (dump_file, ";; Decided to simply peel the loop %d times.\n", loop->lpt_decision.times); } -/* Peel a LOOP LOOP->LPT_DECISION.TIMES times. The transformation: +/* Peel a LOOP LOOP->LPT_DECISION.TIMES times. The transformation does this: + while (cond) body; - ==> + ==> (LOOP->LPT_DECISION.TIMES == 3) if (!cond) goto end; body; if (!cond) goto end; body; + if (!cond) goto end; + body; while (cond) body; end: ; @@ -1464,16 +1460,16 @@ decide_unroll_stupid (struct loop *loop, int flags) loop->lpt_decision.times = i - 1; if (dump_file) - fprintf (dump_file, - ";; Decided to unroll the loop stupidly, %d times.\n", + fprintf (dump_file, ";; Decided to unroll the loop stupidly %d times.\n", loop->lpt_decision.times); } -/* Unroll a LOOP LOOP->LPT_DECISION.TIMES times. The transformation: +/* Unroll a LOOP LOOP->LPT_DECISION.TIMES times. The transformation does this: + while (cond) body; - ==> + ==> (LOOP->LPT_DECISION.TIMES == 3) while (cond) { |