diff options
author | Joern Rennecke <joern.rennecke@embecosm.com> | 2012-10-16 16:11:00 +0000 |
---|---|---|
committer | Joern Rennecke <joern.rennecke@embecosm.com> | 2012-10-16 16:11:00 +0000 |
commit | 39164f860370f95909a9e73de4f0488569f87602 (patch) | |
tree | 151f058d31629859a64d2c1171d2f55fdcb003d3 /gcc/loop-doloop.c | |
parent | 29aeb4dbaf307e4f485350e2cb2e6eaa65560752 (diff) |
* loop-doloop.c (doloop_modify): Pass doloop_end pattern to
gen_doloop_begin.
(doloop_optimize): Pass flag to indicate if loop is entered at top
to gen_doloop_end.
* config/arm/thumb2.md (doloop_end): Accept extra operand.
* config/bfin/bfin.md (doloop_end): Likewise.
* config/c6x/c6x.md (doloop_end): Likewise.
* config/ia64/ia64.md (doloop_end): Likewise.
* config/mep/mep.md (doloop_begin, doloop_end): Likewise.
* config/rs6000/rs6000.md (doloop_end): Likewise.
* config/s390/s390.md (doloop_end): Likewise.
* config/sh/sh.md (doloop_end): Likewise.
* config/spu/spu.md (doloop_end): Likewise.
* config/tilegx/tilegx.md (doloop_end): Likewise.
* config/tilepro/tilepro.md (doloop_end): Likewise.
* doc/md.texi (doloop_end): Document new operand.
* basic-block.h (contains_no_active_insn_p): Declare.
* cfgrtl.c (contains_no_active_insn_p): New function, factored
out of ...
(forwarder_block_p): ... here.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@192505 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/loop-doloop.c')
-rw-r--r-- | gcc/loop-doloop.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c index 8dcfea5bba8..9be87c64aea 100644 --- a/gcc/loop-doloop.c +++ b/gcc/loop-doloop.c @@ -1,5 +1,5 @@ /* Perform doloop optimizations - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2012 Free Software Foundation, Inc. Based on code by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz) @@ -561,7 +561,8 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, init = gen_doloop_begin (counter_reg, desc->const_iter ? desc->niter_expr : const0_rtx, iter_rtx, - GEN_INT (level)); + GEN_INT (level), + doloop_seq); if (init) { start_sequence (); @@ -619,6 +620,7 @@ doloop_optimize (struct loop *loop) unsigned word_mode_size; unsigned HOST_WIDE_INT word_mode_max; double_int iter; + int entered_at_top; if (dump_file) fprintf (dump_file, "Doloop: Processing loop %d.\n", loop->num); @@ -681,8 +683,14 @@ doloop_optimize (struct loop *loop) not like. */ start_label = block_label (desc->in_edge->dest); doloop_reg = gen_reg_rtx (mode); + entered_at_top = loop_preheader_edge (loop)->dest == desc->in_edge->dest; + fprintf (stderr, "entered at top orig: %d\n", entered_at_top); + entered_at_top = (loop->latch == desc->in_edge->dest + && contains_no_active_insn_p (loop->latch)); + fprintf (stderr, "entered at top Zdenek: %d\n", entered_at_top); doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max, - GEN_INT (level), start_label); + GEN_INT (level), start_label, + GEN_INT (entered_at_top)); word_mode_size = GET_MODE_PRECISION (word_mode); word_mode_max @@ -712,7 +720,8 @@ doloop_optimize (struct loop *loop) } PUT_MODE (doloop_reg, word_mode); doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max, - GEN_INT (level), start_label); + GEN_INT (level), start_label, + GEN_INT (entered_at_top)); } if (! doloop_seq) { |