aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-04-10 11:27:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-04-10 11:27:05 +0000
commitba6ee9fc83ea84afad140fe6092109fad187544e (patch)
tree7e9b98ba1dfccc36f3920132c5ab18f7762c1527 /gcc
parent4d1a05f13808cc12c09e71e6ca3951e878184bb2 (diff)
downloadgcc-ba6ee9fc83ea84afad140fe6092109fad187544e.zip
gcc-ba6ee9fc83ea84afad140fe6092109fad187544e.tar.gz
gcc-ba6ee9fc83ea84afad140fe6092109fad187544e.tar.bz2
re PR tree-optimization/80304 (Wrong result with do concurrent)
2017-04-10 Richard Biener <rguenther@suse.de> PR tree-optimization/80304 * tree-ssa-loop-im.c (ref_indep_loop_p_1): Also recurse for safelen. * gcc.dg/torture/pr80304.c: New testcase. From-SVN: r246803
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr80304.c27
-rw-r--r--gcc/tree-ssa-loop-im.c14
4 files changed, 51 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e763c42..b02a810 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/80304
+ * tree-ssa-loop-im.c (ref_indep_loop_p_1): Also recurse
+ for safelen.
+
2017-04-10 Nathan Sidwell <nathan@acm.org>
PR target/79905
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06ea8f7..d579a09 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/80304
+ * gcc.dg/torture/pr80304.c: New testcase.
+
2017-04-10 Nathan Sidwell <nathan@acm.org>
PR target/79905
diff --git a/gcc/testsuite/gcc.dg/torture/pr80304.c b/gcc/testsuite/gcc.dg/torture/pr80304.c
new file mode 100644
index 0000000..814f080
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr80304.c
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+
+int __attribute__((pure,noinline,noclone)) foo (int *p)
+{
+ return *p * 2;
+}
+
+int main()
+{
+ int k = 0;
+ int i;
+#pragma GCC ivdep
+ for (k = 0; k < 9;)
+ {
+ i = 0;
+ while (1)
+ {
+ k += foo (&i);
+ if (k > 7)
+ break;
+ i++;
+ }
+ }
+ if (k != 12)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index dcd941c..0d806da 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -2145,9 +2145,21 @@ ref_indep_loop_p_1 (int safelen, struct loop *loop, im_mem_ref *ref,
fprintf (dump_file, "\n");
}
+ /* We need to recurse to properly handle UNANALYZABLE_MEM_ID. */
+ struct loop *inner = loop->inner;
+ while (inner)
+ {
+ if (!ref_indep_loop_p_1 (safelen, inner, ref, stored_p, ref_loop))
+ {
+ indep_p = false;
+ break;
+ }
+ inner = inner->next;
+ }
+
/* Avoid caching here as safelen depends on context and refs
are shared between different contexts. */
- return true;
+ return indep_p;
}
else
{