aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2019-04-02 18:45:57 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2019-04-02 18:45:57 +0300
commit6fb8055edde15e304f77fbac2c2f317a5a44d6e9 (patch)
treea5f041be88763f9bc102337463446087d3e23094
parent7dc69ec076bf4baa128a1ee660014bfefe3828df (diff)
downloadgcc-6fb8055edde15e304f77fbac2c2f317a5a44d6e9.zip
gcc-6fb8055edde15e304f77fbac2c2f317a5a44d6e9.tar.gz
gcc-6fb8055edde15e304f77fbac2c2f317a5a44d6e9.tar.bz2
sel-sched: skip outer loop in get_all_loop_exits (PR 84206)
2019-04-02 Andrey Belevantsev <abel@ispras.ru> PR rtl-optimization/84206 * sel-sched-ir.h (get_all_loop_exits): Avoid the outer loop when iterating over loop headers. * gcc.dg/pr84206.c: New test. From-SVN: r270096
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/sel-sched-ir.h10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr84206.c24
4 files changed, 42 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e020997..f36a769 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2019-04-02 Andrey Belevantsev <abel@ispras.ru>
+ PR rtl-optimization/84206
+ * sel-sched-ir.h (get_all_loop_exits): Avoid the outer loop when
+ iterating over loop headers.
+
+2019-04-02 Andrey Belevantsev <abel@ispras.ru>
+
PR rtl-optimization/85876
* sel-sched.c (code_motion_path_driver): Avoid unwinding first_insn
beyond the original fence.
diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h
index 1d9c04a..5dd273f 100644
--- a/gcc/sel-sched-ir.h
+++ b/gcc/sel-sched-ir.h
@@ -1144,6 +1144,7 @@ get_all_loop_exits (basic_block bb)
struct loop *this_loop;
struct loop *pred_loop = NULL;
int i;
+ unsigned this_depth;
edge e;
for (this_loop = bb->loop_father;
@@ -1155,11 +1156,14 @@ get_all_loop_exits (basic_block bb)
gcc_assert (this_loop != NULL);
exits = get_loop_exit_edges_unique_dests (this_loop);
+ this_depth = loop_depth (this_loop);
- /* Traverse all loop headers. */
+ /* Traverse all loop headers. Be careful not to go back
+ to the outer loop's header (see PR 84206). */
for (i = 0; exits.iterate (i, &e); i++)
- if (in_current_region_p (e->dest)
- || inner_loop_header_p (e->dest))
+ if ((in_current_region_p (e->dest)
+ || (inner_loop_header_p (e->dest)))
+ && loop_depth (e->dest->loop_father) >= this_depth)
{
vec<edge> next_exits = get_all_loop_exits (e->dest);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 04d9de4..6e26cbe 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-04-02 Andrey Belevantsev <abel@ispras.ru>
+ PR rtl-optimization/84206
+ * gcc.dg/pr84206.c: New test.
+
+2019-04-02 Andrey Belevantsev <abel@ispras.ru>
+
PR rtl-optimization/85876
* gcc.dg/pr85876.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr84206.c b/gcc/testsuite/gcc.dg/pr84206.c
new file mode 100644
index 0000000..b4ac9c2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr84206.c
@@ -0,0 +1,24 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fselective-scheduling -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fno-forward-propagate -fno-tree-fre -w" } */
+
+long long unsigned int ao;
+int hk;
+
+void
+b8 (void)
+{
+ int *w9;
+
+ c8:
+ ao = 0;
+ w9 = &ao;
+ for (;;)
+ for (hk = 0; hk < 1; ++hk)
+ for (ao = 0; ao < 4; ++ao)
+ {
+ int f4 = (ao != 0) ? *w9 : hk;
+
+ if (f4 != 0)
+ goto c8;
+ }
+}