Hi,
when compiling src/gcc/testsuite/gcc.dg/vect/unswitch-loops-pr26969.c
and src/gcc/testsuite/gcc.c-torture/compile/pr32399.c with -O2
-funswitch-loops -ftree-parallelize-loops=2 we run into two different ICEs.
In both cases, -funswitch-loops introduces a virtual memory phi in the
latch, and transform_to_exit_first_loop_alt assumes there are no phis in
the latch, and generates invalid ssa as a result.
The patch fixes the problem by testing for phis in the latch in
try_transform_to_exit_first_loop_alt.
Bootstrapped and reg-tested on x86_64.
Committed to trunk.
Thanks,
- Tom
Don't allow latch with phi in try_transform_to_exit_first_loop_alt
2016-01-07 Tom de Vries <t...@codesourcery.com>
PR tree-optimization/69109
* tree-parloops.c (try_transform_to_exit_first_loop_alt): Don't allow
latch with phi.
* gcc.dg/autopar/pr69109-2.c: New test.
* gcc.dg/autopar/pr69109.c: New test.
---
gcc/testsuite/gcc.dg/autopar/pr69109-2.c | 4 ++++
gcc/testsuite/gcc.dg/autopar/pr69109.c | 4 ++++
gcc/tree-parloops.c | 4 ++++
3 files changed, 12 insertions(+)
diff --git a/gcc/testsuite/gcc.dg/autopar/pr69109-2.c b/gcc/testsuite/gcc.dg/autopar/pr69109-2.c
new file mode 100644
index 0000000..0a3154b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/autopar/pr69109-2.c
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-parallelize-loops=2 -funswitch-loops" } */
+
+#include "../../gcc.c-torture/compile/pr32399.c"
diff --git a/gcc/testsuite/gcc.dg/autopar/pr69109.c b/gcc/testsuite/gcc.dg/autopar/pr69109.c
new file mode 100644
index 0000000..58f3a9f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/autopar/pr69109.c
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-parallelize-loops=2 -funswitch-loops" } */
+
+#include "../vect/unswitch-loops-pr26969.c"
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index d683704..5afaaf8 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -1769,6 +1769,10 @@ try_transform_to_exit_first_loop_alt (struct loop *loop,
if (!gimple_seq_nondebug_singleton_p (bb_seq (loop->latch)))
return false;
+ /* Check whether the latch contains no phis. */
+ if (phi_nodes (loop->latch) != NULL)
+ return false;
+
/* Check whether the latch contains the loop iv increment. */
edge back = single_succ_edge (loop->latch);
edge exit = single_dom_exit (loop);