aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-04-25 10:49:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-04-25 10:49:55 +0000
commitab99f46749d0f746c50dde27e845ed6e5f06aee4 (patch)
tree7849aae88789ca5496d8e3c5ad4a134e378b42a7 /gcc
parente52477c7e2525d9ebffcc47de2d226452e6fbafc (diff)
downloadgcc-ab99f46749d0f746c50dde27e845ed6e5f06aee4.zip
gcc-ab99f46749d0f746c50dde27e845ed6e5f06aee4.tar.gz
gcc-ab99f46749d0f746c50dde27e845ed6e5f06aee4.tar.bz2
re PR tree-optimization/70780 (wrong code at -O2 and -O3 on x86_64-linux-gnu)
2016-04-25 Richard Biener <rguenther@suse.de> PR tree-optimization/70780 * tree-ssa-pre.c (compute_antic_aux): Also return true if the block wasn't visited yet. (compute_antic): Mark blocks with abnormal preds as visited as they have a final empty antic-in solution already. * gcc.dg/torture/pr70780.c: New testcase. From-SVN: r235407
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70780.c26
-rw-r--r--gcc/tree-ssa-pre.c3
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e70bcaf..2dac38e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,13 @@
+2016-04-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/70780
+ * tree-ssa-pre.c (compute_antic_aux): Also return true if the block
+ wasn't visited yet.
+ (compute_antic): Mark blocks with abnormal preds as visited as
+ they have a final empty antic-in solution already.
+
2016-04-25 Michael Collison <michael.collison@linaro.org>
+
* ChangeLog(2016-04-25): Fix ChangeLog formatting.
2016-04-25 Michael Collison <michael.collison@linaro.org>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d49f189..bbaa3a2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-25 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/70780
+ * gcc.dg/torture/pr70780.c: New testcase.
+
2016-04-25 Michael Collison <michael.collison@arm.com>
* testsuite/gcc.target/arm/neon-vaddws16.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr70780.c b/gcc/testsuite/gcc.dg/torture/pr70780.c
new file mode 100644
index 0000000..2f7a5cb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70780.c
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+int a, b, c, *d, e;
+
+static int
+fn1 ()
+{
+ if (a)
+ goto l1;
+l2: while (b)
+ if (*d)
+ return c;
+ for (e = 0; e; e++)
+ {
+ goto l2;
+l1:;
+ }
+ return 0;
+}
+
+int
+main ()
+{
+ fn1 ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 2d1eb70..7b9eb2e 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2077,6 +2077,7 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
unsigned int bii;
edge e;
edge_iterator ei;
+ bool was_visited = BB_VISITED (block);
old = ANTIC_OUT = S = NULL;
BB_VISITED (block) = 1;
@@ -2167,7 +2168,7 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
clean (ANTIC_IN (block));
- if (!bitmap_set_equal (old, ANTIC_IN (block)))
+ if (!was_visited || !bitmap_set_equal (old, ANTIC_IN (block)))
changed = true;
maybe_dump_sets: