diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-11-09 11:42:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2013-11-09 11:42:16 +0000 |
commit | 1d0216c8b79931cffcc5599b8a9a4f6eaf86d2b7 (patch) | |
tree | 5b96e2c7a588193d1b4019f9316a1ca13b8376ce /gcc/loop-doloop.c | |
parent | 12929715b124071e523316c28897c8a05083cf12 (diff) | |
download | gcc-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.c | 69 |
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) { |