re PR tree-optimization/79943 (Loop splitting breaks with loops of pointer type)
authorAndrew Haley <aph@redhat.com>
Wed, 8 Mar 2017 11:35:23 +0000 (11:35 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Wed, 8 Mar 2017 11:35:23 +0000 (11:35 +0000)
2017-03-08  Andrew Haley  <aph@redhat.com>

PR tree-optimization/79943
* tree-ssa-loop-split.c (compute_new_first_bound): When
calculating the new upper bound, (END-BEG) should be added, not
subtracted.

From-SVN: r245974

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr79943.c [new file with mode: 0644]
gcc/tree-ssa-loop-split.c

index 212ebc64f1cd76520842c87633f469543d0457fe..56b228122770cce073ae75a98d335eb9393c6962 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-08  Andrew Haley  <aph@redhat.com>
+
+       PR tree-optimization/79943
+       * tree-ssa-loop-split.c (compute_new_first_bound): When
+       calculating the new upper bound, (END-BEG) should be added, not
+       subtracted.
+
 2017-03-08  Jakub Jelinek  <jakub@redhat.com>
 
        * config/avr/avr.md (setmemhi): Make sure match_dup
index eef88268eba3ff7b303f7f0861dc97ff29247f6f..7a539e6e5ca01f4fea01f6c38338d0aa54b04072 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-08  Andrew Haley  <aph@redhat.com>
+
+       PR tree-optimization/79943
+       * gcc.dg/tree-ssa/pr79943.c: New test.
+
 2017-03-08  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/79920
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr79943.c b/gcc/testsuite/gcc.dg/tree-ssa/pr79943.c
new file mode 100644 (file)
index 0000000..d841d60
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fsplit-loops -fdump-tree-lsplit-details" } */
+/* { dg-require-effective-target int32plus } */
+
+#ifdef __cplusplus
+extern "C" void abort (void);
+#else
+extern void abort (void);
+#endif
+
+typedef struct {
+  int n;
+} region_t;
+
+void set (region_t *region) __attribute__((noinline));
+void doit (region_t *beg, region_t *end, region_t *limit)
+  __attribute__((noinline));
+
+region_t regions[10];
+
+void
+set (region_t *region) {
+  region->n = 1;
+}
+
+void
+doit (region_t *beg, region_t *end, region_t *limit) {
+  for (region_t *cur = beg; cur < end; cur++) {
+    if (cur < limit) {
+      set(cur);
+    }
+  }
+}
+
+int
+main (void) {
+  doit(&regions[0], &regions[2], &regions[10]);
+  if (regions[1].n != 1)
+    abort();
+}
index 39bffc4ef17e44786745f48702bb34bce9caa2e6..fd97213774950077a6d436568f679f04c04962b7 100644 (file)
@@ -436,7 +436,6 @@ compute_new_first_bound (gimple_seq *stmts, struct tree_niter_desc *niter,
   if (POINTER_TYPE_P (TREE_TYPE (guard_init)))
     {
       enddiff = gimple_convert (stmts, sizetype, enddiff);
-      enddiff = gimple_build (stmts, NEGATE_EXPR, sizetype, enddiff);
       newbound = gimple_build (stmts, POINTER_PLUS_EXPR,
                               TREE_TYPE (guard_init),
                               guard_init, enddiff);