aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-iv.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2005-07-21 07:24:34 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2005-07-21 07:24:34 +0000
commitf9cc1a70d51e2874055417fd0153e4434f0d9d89 (patch)
tree1ae11d72157fada15be9c9e63cd5c9c48811abca /gcc/loop-iv.c
parentcb83c2ec4187b1781ea17180267bcfe90f5e0e9c (diff)
downloadgcc-f9cc1a70d51e2874055417fd0153e4434f0d9d89.zip
gcc-f9cc1a70d51e2874055417fd0153e4434f0d9d89.tar.gz
gcc-f9cc1a70d51e2874055417fd0153e4434f0d9d89.tar.bz2
re PR rtl-optimization/19210 (not using do-loop for some loops)
gcc: 2005-07-21 Paolo Bonzini <bonzini@gnu.org> Zdenek Dvorak <dvorakz@suse.cz> PR tree-optimization/19210 * common.opt (Wunsafe-loop-optimizations, funsafe-loop-optimizations): New. * Makefile.in (tree-ssa-loop-niter.o): Depend intl.o. * loop-iv.c (get_simple_loop_desc): If -funsafe-loop-optimizations, rely on unproven assumptions. * predict.c (predict_loops): Adjust call to number_of_iterations_exit. * tree-flow.h (number_of_iterations_exit): Add final parameter. * tree-scalar-evolution.c (number_of_iterations_in_loop): Adjust call to number_of_iterations_exit. * tree-ssa-loop-ivcanon.c (empty_loop_p): Likewise. * tree-ssa-loop-ivopts.c (niter_for_exit): Likewise. * tree-ssa-loop-niter.c (find_loop_niter, estimate_numbers_of_iterations_loop): Likewise. (number_of_iterations_exit): Honor the new options. * doc/invoke.texi (Wunsafe-loop-optimizations, funsafe-loop-optimizations): Document them. gcc/testsuite: 2005-07-21 Paolo Bonzini <bonzini@gnu.org> * gcc.dg/tree-ssa/pr19210-1.c: New. * gcc.dg/tree-ssa/pr19210-2.c: New. Co-Authored-By: Zdenek Dvorak <dvorakz@suse.cz> From-SVN: r102225
Diffstat (limited to 'gcc/loop-iv.c')
-rw-r--r--gcc/loop-iv.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 48bae0b..7c7a5de 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -57,7 +57,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "basic-block.h"
#include "cfgloop.h"
#include "expr.h"
+#include "intl.h"
#include "output.h"
+#include "toplev.h"
/* The insn information. */
@@ -2692,6 +2694,41 @@ get_simple_loop_desc (struct loop *loop)
find_simple_exit (loop, desc);
loop->aux = desc;
+ if (desc->simple_p && (desc->assumptions || desc->infinite))
+ {
+ const char *wording;
+
+ /* Assume that no overflow happens and that the loop is finite.
+ We already warned at the tree level if we ran optimizations there. */
+ if (!flag_tree_loop_optimize && warn_unsafe_loop_optimizations)
+ {
+ if (desc->infinite)
+ {
+ wording =
+ flag_unsafe_loop_optimizations
+ ? N_("assuming that the loop is not infinite")
+ : N_("cannot optimize possibly infinite loops");
+ warning (OPT_Wunsafe_loop_optimizations, "%s",
+ gettext (wording));
+ }
+ if (desc->assumptions)
+ {
+ wording =
+ flag_unsafe_loop_optimizations
+ ? N_("assuming that the loop counter does not overflow")
+ : N_("cannot optimize loop, the loop counter may overflow");
+ warning (OPT_Wunsafe_loop_optimizations, "%s",
+ gettext (wording));
+ }
+ }
+
+ if (flag_unsafe_loop_optimizations)
+ {
+ desc->assumptions = NULL_RTX;
+ desc->infinite = NULL_RTX;
+ }
+ }
+
return desc;
}