diff options
author | Pat Haugen <pthaugen@us.ibm.com> | 2016-11-10 18:55:57 +0000 |
---|---|---|
committer | Pat Haugen <pthaugen@gcc.gnu.org> | 2016-11-10 18:55:57 +0000 |
commit | 8d34bfa865fb527b6a3569528656e2dc8af592e0 (patch) | |
tree | 223b62a9c66bd4b015116cdb4548e792f4fe43a6 /gcc/loop-unroll.c | |
parent | a1566696653132892d629525644c2c63da8dab87 (diff) |
re PR rtl-optimization/78241 (wrong code with -funroll-loops)
PR rtl-optimization/78241
* loop-unroll.c (unroll_loop_runtime_iterations): Don't adjust 'niter', but
emit initial peel copy if niter expr is not reliable.
* gcc.dg/pr78241.c: New test.
From-SVN: r242047
Diffstat (limited to 'gcc/loop-unroll.c')
-rw-r--r-- | gcc/loop-unroll.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 91118a310d0..760445e6448 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -918,9 +918,10 @@ unroll_loop_runtime_iterations (struct loop *loop) if (tmp != niter) emit_move_insn (niter, tmp); - /* For loops that exit at end, add one to niter to account for first pass - through loop body before reaching exit test. */ - if (exit_at_end) + /* For loops that exit at end and whose number of iterations is reliable, + add one to niter to account for first pass through loop body before + reaching exit test. */ + if (exit_at_end && !desc->noloop_assumptions) { niter = expand_simple_binop (desc->mode, PLUS, niter, const1_rtx, @@ -946,7 +947,7 @@ unroll_loop_runtime_iterations (struct loop *loop) auto_sbitmap wont_exit (max_unroll + 2); - if (extra_zero_check) + if (extra_zero_check || desc->noloop_assumptions) { /* Peel the first copy of loop body. Leave the exit test if the number of iterations is not reliable. Also record the place of the extra zero |