From: Richard Guenther Date: Wed, 10 Oct 2007 09:24:43 +0000 (+0000) Subject: re PR tree-optimization/33099 (Scalar evolutions confusing VRP with pointer values... X-Git-Tag: prereleases/gcc-4.2.3-rc1~203 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=855c9f3b866772abab4f57438b7013ab4e828397;p=thirdparty%2Fgcc.git re PR tree-optimization/33099 (Scalar evolutions confusing VRP with pointer values that wrap around) 2007-10-10 Richard Guenther PR tree-optimization/33099 PR tree-optimization/33381 * tree-vrp.c (adjust_range_with_scev): Do not adjust ranges from pointer typed chrecs. * gcc.c-torture/execute/pr33099.c: New testcase. * gcc.c-torture/execute/pr33381.c: Likewise. From-SVN: r129197 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7acb9046ec35..5d85ecea41f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-10-10 Richard Guenther + + PR tree-optimization/33099 + PR tree-optimization/33381 + * tree-vrp.c (adjust_range_with_scev): Do not adjust ranges + from pointer typed chrecs. + 2007-10-08 Mark Mitchell * BASE-VER: Bump. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b0c8f37ed656..4ddcfea428c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-10-10 Richard Guenther + + PR tree-optimization/33099 + PR tree-optimization/33381 + * gcc.c-torture/execute/pr33099.c: New testcase. + * gcc.c-torture/execute/pr33381.c: Likewise. + 2007-10-07 Release Manager * GCC 4.2.2 released. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr33099.c b/gcc/testsuite/gcc.c-torture/execute/pr33099.c new file mode 100644 index 000000000000..1a385e1adcf1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr33099.c @@ -0,0 +1,26 @@ +extern void abort (void); + +volatile int N = 5; + +void foo (void) +{ + int i; + char *p, value[10]; + + value[0] = 0x42; + for (i = 0; i < N; i++) + if (i > 0) + { + p = (char *)i - 1; + *(value + (int) p) = (char) i; + } + + if (value[0] != 1) + abort (); +} + +main() +{ + foo (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr33381.c b/gcc/testsuite/gcc.c-torture/execute/pr33381.c new file mode 100644 index 000000000000..6d4144f77d01 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr33381.c @@ -0,0 +1,15 @@ +extern void abort(void); +void x(void *data) +{ + if ((long)data < 0) + abort(); +} +int main() +{ + long i; + for (i = 0; i < 5; i++) + if (i > 0) + x((void *)(i - 1)); + return 0; +} + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index ad5c27a3cebd..eb9b34852a8e 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2486,6 +2486,10 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, if (TREE_CODE (chrec) != POLYNOMIAL_CHREC) return; + /* Don't adjust ranges from pointer CHRECs. */ + if (POINTER_TYPE_P (TREE_TYPE (chrec))) + return; + init = initial_condition_in_loop_num (chrec, loop->num); step = evolution_part_in_loop_num (chrec, loop->num);