aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-doloop.c
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2013-11-09 11:42:16 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2013-11-09 11:42:16 +0000
commit1d0216c8b79931cffcc5599b8a9a4f6eaf86d2b7 (patch)
tree5b96e2c7a588193d1b4019f9316a1ca13b8376ce /gcc/loop-doloop.c
parent12929715b124071e523316c28897c8a05083cf12 (diff)
downloadgcc-1d0216c8b79931cffcc5599b8a9a4f6eaf86d2b7.zip
gcc-1d0216c8b79931cffcc5599b8a9a4f6eaf86d2b7.tar.gz
gcc-1d0216c8b79931cffcc5599b8a9a4f6eaf86d2b7.tar.bz2
target.def (can_use_doloop_p): New hook.
gcc/ * target.def (can_use_doloop_p): New hook. * doc/tm.texi.in (TARGET_CAN_USE_DOLOOP_P): Add. * doc/tm.texi: Regenerate. * doc/md.texi (doloop_begin, doloop_end): Update documentation. * hooks.h (hook_bool_dint_dint_uint_true): Declare. * hooks.c (hook_bool_dint_dint_uint_true): New function. * targhooks.h (can_use_doloop_if_innermost): Declare. * targhooks.c (can_use_doloop_if_innermost): New function. * target.h: Include double-int.h. * loop-doloop.c (doloop_optimize): Call targetm.can_use_doloop_p. Remove iteration count, maximum iteration count, loop depth and enter-at-top inputs from doloop_begin and doloop_end. * config/arc/arc.md (doloop_begin, doloop_end): Update for new interface. * config/arc/arc.c (arc_can_use_doloop_p): New function. (TARGET_CAN_USE_DOLOOP_P): Define. * config/arm/thumb2.md (doloop_end): Update for new interface. * config/arm/arm.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/bfin/bfin.md (doloop_end): Update for new interface. * config/bfin/bfin.c (bfin_can_use_doloop_p): New function. (TARGET_CAN_USE_DOLOOP_P): Define. * config/c6x/c6x.md (doloop_end): Update for new interface. * config/ia64/ia64.md (doloop_end): Update for new interface. * config/ia64/ia64.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/mep/mep.md (doloop_begin, doloop_end): Update for new interface. * config/mep/mep.c (mep_emit_doloop): Likewise. (TARGET_CAN_USE_DOLOOP_P): Define. * config/rs6000/rs6000.md (doloop_end): Update for new interface. * config/rs6000/rs6000.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/s390/s390.md (doloop_end): Update for new interface. * config/sh/sh.md (doloop_end): Likewise. * config/spu/spu.md (doloop_end): Likewise. * config/spu/spu.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/tilegx/tilegx.md (doloop_end): Update for new interface. * config/tilegx/tilegx.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/tilepro/tilepro.md (doloop_end): Update for new interface. * config/tilepro/tilepro.c (TARGET_CAN_USE_DOLOOP_P): Define. * config/v850/v850.md (doloop_begin, doloop_end): Update for new interface. * config/v850/v850.c (TARGET_CAN_USE_DOLOOP_P): Define. From-SVN: r204614
Diffstat (limited to 'gcc/loop-doloop.c')
-rw-r--r--gcc/loop-doloop.c69
1 files changed, 24 insertions, 45 deletions
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c
index 1bc9aa3..82c01a5 100644
--- a/gcc/loop-doloop.c
+++ b/gcc/loop-doloop.c
@@ -548,20 +548,8 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
#ifdef HAVE_doloop_begin
{
rtx init;
- unsigned level = get_loop_level (loop) + 1;
- double_int iter;
- rtx iter_rtx;
-
- if (!get_max_loop_iterations (loop, &iter)
- || !iter.fits_shwi ())
- iter_rtx = const0_rtx;
- else
- iter_rtx = GEN_INT (iter.to_shwi ());
- init = gen_doloop_begin (counter_reg,
- desc->const_iter ? desc->niter_expr : const0_rtx,
- iter_rtx,
- GEN_INT (level),
- doloop_seq);
+
+ init = gen_doloop_begin (counter_reg, doloop_seq);
if (init)
{
start_sequence ();
@@ -608,8 +596,8 @@ doloop_optimize (struct loop *loop)
{
enum machine_mode mode;
rtx doloop_seq, doloop_pat, doloop_reg;
- rtx iterations, count;
- rtx iterations_max;
+ rtx count;
+ double_int iterations, iterations_max;
rtx start_label;
rtx condition;
unsigned level, est_niter;
@@ -617,7 +605,6 @@ doloop_optimize (struct loop *loop)
struct niter_desc *desc;
unsigned word_mode_size;
unsigned HOST_WIDE_INT word_mode_max;
- double_int iter;
int entered_at_top;
if (dump_file)
@@ -667,25 +654,30 @@ doloop_optimize (struct loop *loop)
return false;
}
- count = copy_rtx (desc->niter_expr);
- iterations = desc->const_iter ? desc->niter_expr : const0_rtx;
- if (!get_max_loop_iterations (loop, &iter)
- || !iter.fits_shwi ())
- iterations_max = const0_rtx;
+ if (desc->const_iter)
+ iterations = rtx_to_double_int (desc->niter_expr);
else
- iterations_max = GEN_INT (iter.to_shwi ());
+ iterations = double_int_zero;
+ if (!get_max_loop_iterations (loop, &iterations_max))
+ iterations_max = double_int_zero;
level = get_loop_level (loop) + 1;
+ entered_at_top = (loop->latch == desc->in_edge->dest
+ && contains_no_active_insn_p (loop->latch));
+ if (!targetm.can_use_doloop_p (iterations, iterations_max, level,
+ entered_at_top))
+ {
+ if (dump_file)
+ fprintf (dump_file, "Loop rejected by can_use_doloop_p.\n");
+ return false;
+ }
/* Generate looping insn. If the pattern FAILs then give up trying
to modify the loop since there is some aspect the back-end does
not like. */
+ count = copy_rtx (desc->niter_expr);
start_label = block_label (desc->in_edge->dest);
doloop_reg = gen_reg_rtx (mode);
- entered_at_top = (loop->latch == desc->in_edge->dest
- && contains_no_active_insn_p (loop->latch));
- doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max,
- GEN_INT (level), start_label,
- GEN_INT (entered_at_top));
+ doloop_seq = gen_doloop_end (doloop_reg, start_label);
word_mode_size = GET_MODE_PRECISION (word_mode);
word_mode_max
@@ -696,27 +688,14 @@ doloop_optimize (struct loop *loop)
computed, we must be sure that the number of iterations fits into
the new mode. */
&& (word_mode_size >= GET_MODE_PRECISION (mode)
- || iter.ule (double_int::from_shwi (word_mode_max))))
+ || iterations_max.ule (double_int::from_shwi (word_mode_max))))
{
if (word_mode_size > GET_MODE_PRECISION (mode))
- {
- count = simplify_gen_unary (ZERO_EXTEND, word_mode,
- count, mode);
- iterations = simplify_gen_unary (ZERO_EXTEND, word_mode,
- iterations, mode);
- iterations_max = simplify_gen_unary (ZERO_EXTEND, word_mode,
- iterations_max, mode);
- }
+ count = simplify_gen_unary (ZERO_EXTEND, word_mode, count, mode);
else
- {
- count = lowpart_subreg (word_mode, count, mode);
- iterations = lowpart_subreg (word_mode, iterations, mode);
- iterations_max = lowpart_subreg (word_mode, iterations_max, mode);
- }
+ count = lowpart_subreg (word_mode, count, mode);
PUT_MODE (doloop_reg, word_mode);
- doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max,
- GEN_INT (level), start_label,
- GEN_INT (entered_at_top));
+ doloop_seq = gen_doloop_end (doloop_reg, start_label);
}
if (! doloop_seq)
{