summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-21 13:18:35 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-21 13:18:35 +0000
commit4303ef3121864beffcef00e939c363bd8545cd8c (patch)
tree192534fbe477f8655f8011eda548a0babc4ce3a4
parent92903ced17cf115d55b14cbcf9ec5d8217fcd8cb (diff)
downloadgcc-4303ef3121864beffcef00e939c363bd8545cd8c.tar.gz
2017-08-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/81900 * tree-ssa-pre.c (compute_antic_aux): Properly compute changed for blocks with abnormal predecessors. (compute_antic): Do not set visited flag prematurely. * gcc.dg/torture/pr81900.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251226 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr81900.c19
-rw-r--r--gcc/tree-ssa-pre.c10
4 files changed, 34 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e0dae1503dc..25b745208a7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-21 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81900
+ * tree-ssa-pre.c (compute_antic_aux): Properly compute changed
+ for blocks with abnormal predecessors.
+ (compute_antic): Do not set visited flag prematurely.
+
2017-08-21 Georg-Johann Lay <avr@gjlay.de>
PR target/79883
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 731c812826a..53505ef21f4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2017-08-21 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/81900
+ * gcc.dg/torture/pr81900.c: New testcase.
+
+2017-08-21 Richard Biener <rguenther@suse.de>
+
* c-c++-common/asan/global-overflow-1.c: Adjust diagnostic location
regex to handle the LTO case.
* c-c++-common/asan/heap-overflow-1.c: Likewise.
diff --git a/gcc/testsuite/gcc.dg/torture/pr81900.c b/gcc/testsuite/gcc.dg/torture/pr81900.c
new file mode 100644
index 00000000000..9e4e8f4a7ca
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr81900.c
@@ -0,0 +1,19 @@
+/* PR/81900 */
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
+/* { dg-options "-fdump-tree-optimized" } */
+
+void Perl_croak() __attribute__((noreturn));
+char *Perl_sv_gets();
+void __attribute__((returns_twice)) __sigsetjmp ();
+void a() {
+ __sigsetjmp();
+ char *b;
+ if ((b = Perl_sv_gets()) == 0)
+ Perl_croak("No Perl script found in input\n");
+ if (*b == '#')
+ __asm__("" : : ""("badbad"));
+}
+
+/* Do not elide the test against zero. */
+/* { dg-final { scan-tree-dump " == 0B" "optimized" } } */
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index a6a68cf8372..7243cf808f5 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2119,16 +2119,15 @@ static sbitmap has_abnormal_preds;
static bool
compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
{
- bool changed = false;
bitmap_set_t S, old, ANTIC_OUT;
bitmap_iterator bi;
unsigned int bii;
edge e;
edge_iterator ei;
- bool was_visited = BB_VISITED (block);
- old = ANTIC_OUT = S = NULL;
+ bool changed = ! BB_VISITED (block);
BB_VISITED (block) = 1;
+ old = ANTIC_OUT = S = NULL;
/* If any edges from predecessors are abnormal, antic_in is empty,
so do nothing. */
@@ -2217,7 +2216,7 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge)
/* clean (ANTIC_IN (block)) is defered to after the iteration converged
because it can cause non-convergence, see for example PR81181. */
- if (!was_visited || !bitmap_set_equal (old, ANTIC_IN (block)))
+ if (!bitmap_set_equal (old, ANTIC_IN (block)))
changed = true;
maybe_dump_sets:
@@ -2396,9 +2395,6 @@ compute_antic (void)
if (e->flags & EDGE_ABNORMAL)
{
bitmap_set_bit (has_abnormal_preds, block->index);
-
- /* We also anticipate nothing. */
- BB_VISITED (block) = 1;
break;
}