From f33211587118865c4f26f3806355441c4dfdb8b8 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 30 May 2011 11:15:20 +0000 Subject: [PATCH] re PR tree-optimization/49218 (Incorrect optimization of a 'for' loop creates an infinite loop) 2011-05-30 Richard Guenther PR tree-optimization/49218 * tree-vrp.c (adjust_range_with_scev): Properly check whether overflow occured. * gcc.c-torture/execute/pr49218.c: New testcase. From-SVN: r174429 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr49218.c | 20 +++++++++++++++++++ gcc/tree-vrp.c | 14 +++++++++---- 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr49218.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 55522d6d85e..e1d9f65508d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-30 Richard Guenther + + PR tree-optimization/49218 + * tree-vrp.c (adjust_range_with_scev): Properly check whether + overflow occured. + 2011-05-30 Richard Guenther * tree-ssa-forwprop.c (forward_propagate_into_comparison): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60230d8623b..2a504c75e9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-30 Richard Guenther + + PR tree-optimization/49218 + * gcc.c-torture/execute/pr49218.c: New testcase. + 2011-05-30 Ira Rosen PR tree-optimization/49199 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49218.c b/gcc/testsuite/gcc.c-torture/execute/pr49218.c new file mode 100644 index 00000000000..2fb18dda760 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr49218.c @@ -0,0 +1,20 @@ +#ifdef __SIZEOF_INT128__ +typedef __int128 L; +#else +typedef long long L; +#endif +float f; + +int +main () +{ + L i = f; + if (i <= 10) + do + { + ++i; + asm (""); + } + while (i != 11); + return 0; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 8fcf629adde..f40d0d4c890 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3423,11 +3423,17 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, loop->nb_iterations_upper_bound, double_int_one), unsigned_p, &overflow); - tem = double_int_to_tree (TREE_TYPE (init), dtmp); /* If the multiplication overflowed we can't do a meaningful - adjustment. */ - if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem))) - { + adjustment. Likewise if the result doesn't fit in the type + of the induction variable. For a signed type we have to + check whether the result has the expected signedness which + is that of the step as nb_iterations_upper_bound is unsigned. */ + if (!overflow + && double_int_fits_to_tree_p (TREE_TYPE (init), dtmp) + && (unsigned_p + || ((dtmp.high ^ TREE_INT_CST_HIGH (step)) >= 0))) + { + tem = double_int_to_tree (TREE_TYPE (init), dtmp); extract_range_from_binary_expr (&maxvr, PLUS_EXPR, TREE_TYPE (init), init, tem); /* Likewise if the addition did. */ -- 2.30.2