]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/33099 (Scalar evolutions confusing VRP with pointer values...
authorRichard Guenther <rguenther@suse.de>
Wed, 10 Oct 2007 09:24:43 +0000 (09:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 10 Oct 2007 09:24:43 +0000 (09:24 +0000)
2007-10-10  Richard Guenther  <rguenther@suse.de>

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr33099.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr33381.c [new file with mode: 0644]
gcc/tree-vrp.c

index 7acb9046ec355c366a04eb38caa6c44a15d12e29..5d85ecea41f2f49a868327ba8bf9273c020086a0 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-10  Richard Guenther  <rguenther@suse.de>
+
+       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  <mark@codesourcery.com>
 
        * BASE-VER: Bump.
index b0c8f37ed6564cf6942c44037e5a70d40e0be373..4ddcfea428c2a2b58d02de3cc8f318e84fb8a216 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-10  Richard Guenther  <rguenther@suse.de>
+
+       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 (file)
index 0000000..1a385e1
--- /dev/null
@@ -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 (file)
index 0000000..6d4144f
--- /dev/null
@@ -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;
+}
+
index ad5c27a3cebdd92f7955d29ac8a710fe4905868b..eb9b34852a8e465af141969d271bd1bada1db6c8 100644 (file)
@@ -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);