aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2017-07-03 07:21:34 +0000
committerTom de Vries <vries@gcc.gnu.org>2017-07-03 07:21:34 +0000
commit4752be4637d8250516dc0d8171b797de2b413d81 (patch)
treef8f4d7078d0922fe65de98e7f897120309acaf7b /gcc
parent0bbfd5540d15befe675f8bac6a5aa55df9064436 (diff)
downloadgcc-4752be4637d8250516dc0d8171b797de2b413d81.zip
gcc-4752be4637d8250516dc0d8171b797de2b413d81.tar.gz
gcc-4752be4637d8250516dc0d8171b797de2b413d81.tar.bz2
Don't tail-merge blocks from different loops
2017-07-03 Tom de Vries <tom@codesourcery.com> PR tree-optimization/81192 * tree-ssa-tail-merge.c (same_succ_hash): Use bb->loop_father->num in hash. (same_succ::equal): Don't find bbs to be equal if bb->loop_father differs. (find_same_succ_bb): Remove obsolete test on bb->loop_father->latch. * gcc.dg/pr81192.c: Update. From-SVN: r249894
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr81192.c2
-rw-r--r--gcc/tree-ssa-tail-merge.c15
4 files changed, 21 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7284fef..18f23c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,15 @@
2017-07-03 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/81192
+ * tree-ssa-tail-merge.c (same_succ_hash): Use bb->loop_father->num in
+ hash.
+ (same_succ::equal): Don't find bbs to be equal if bb->loop_father
+ differs.
+ (find_same_succ_bb): Remove obsolete test on bb->loop_father->latch.
+
+2017-07-03 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/81192
* tree-ssa-tail-merge.c (same_succ_flush_bb): Handle
BB_SAME_SUCC (bb) == NULL.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dda405a..12d441e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,11 @@
2017-07-03 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/81192
+ * gcc.dg/pr81192.c: Update.
+
+2017-07-03 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/81192
* gcc.dg/pr81192.c: New test.
2017-07-02 Thomas Koenig <tkoenig@gcc.gnu.org>
diff --git a/gcc/testsuite/gcc.dg/pr81192.c b/gcc/testsuite/gcc.dg/pr81192.c
index 57eb478..8b3a77a 100644
--- a/gcc/testsuite/gcc.dg/pr81192.c
+++ b/gcc/testsuite/gcc.dg/pr81192.c
@@ -19,4 +19,4 @@ fn2 (void)
;
}
-/* { dg-final { scan-tree-dump-times "(?n)find_duplicates: <bb .*> duplicate of <bb .*>" 1 "pre" } } */
+/* { dg-final { scan-tree-dump-not "(?n)find_duplicates: <bb .*> duplicate of <bb .*>" "pre" } } */
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index e88072c..6fa4e5b 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -479,6 +479,8 @@ same_succ_hash (const same_succ *e)
hstate.add_int (size);
BB_SIZE (bb) = size;
+ hstate.add_int (bb->loop_father->num);
+
for (i = 0; i < e->succ_flags.length (); ++i)
{
flags = e->succ_flags[i];
@@ -568,6 +570,9 @@ same_succ::equal (const same_succ *e1, const same_succ *e2)
if (BB_SIZE (bb1) != BB_SIZE (bb2))
return 0;
+ if (bb1->loop_father != bb2->loop_father)
+ return 0;
+
gsi1 = gsi_start_nondebug_bb (bb1);
gsi2 = gsi_start_nondebug_bb (bb2);
gsi_advance_fw_nondebug_nonlocal (&gsi1);
@@ -695,15 +700,7 @@ find_same_succ_bb (basic_block bb, same_succ **same_p)
edge_iterator ei;
edge e;
- if (bb == NULL
- /* Be conservative with loop structure. It's not evident that this test
- is sufficient. Before tail-merge, we've just called
- loop_optimizer_finalize, and LOOPS_MAY_HAVE_MULTIPLE_LATCHES is now
- set, so there's no guarantee that the loop->latch value is still valid.
- But we assume that, since we've forced LOOPS_HAVE_SIMPLE_LATCHES at the
- start of pre, we've kept that property intact throughout pre, and are
- keeping it throughout tail-merge using this test. */
- || bb->loop_father->latch == bb)
+ if (bb == NULL)
return;
bitmap_set_bit (same->bbs, bb->index);
FOR_EACH_EDGE (e, ei, bb->succs)