aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-04 12:23:16 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-04 12:23:16 +0100
commit39719c84006d2dc2873cef482de74755925e631f (patch)
tree6ad38258eeb4e950de82db56f085a0ed7cf7ff77 /gcc
parentdad5ed2eb152e85ae2ebb3582d57d895488011a4 (diff)
downloadgcc-39719c84006d2dc2873cef482de74755925e631f.zip
gcc-39719c84006d2dc2873cef482de74755925e631f.tar.gz
gcc-39719c84006d2dc2873cef482de74755925e631f.tar.bz2
re PR tree-optimization/59519 (ICE on valid code at -O3 on x86_64-linux-gnu in slpeel_update_phi_nodes_for_guard1, at tree-vect-loop-manip.c:486)
PR tree-optimization/59519 * tree-vect-loop-manip.c (slpeel_update_phi_nodes_for_guard1): Don't ICE if get_current_def (current_new_name) is already non-NULL, as long as it is a phi result of some other phi in *new_exit_bb that has the same argument. * gcc.dg/vect/pr59519-1.c: New test. * gcc.dg/vect/pr59519-2.c: New test. From-SVN: r206333
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr59519-1.c19
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr59519-2.c20
-rw-r--r--gcc/tree-vect-loop-manip.c13
5 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index caae1f6f..9ce3973 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2014-01-04 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/59519
+ * tree-vect-loop-manip.c (slpeel_update_phi_nodes_for_guard1): Don't
+ ICE if get_current_def (current_new_name) is already non-NULL, as long
+ as it is a phi result of some other phi in *new_exit_bb that has
+ the same argument.
+
* config/i386/sse.md (avx512f_load<mode>_mask): Emit vmovup{s,d}
or vmovdqu* for misaligned_operand.
(<sse>_loadu<ssemodesuffix><avxsizesuffix><mask_name>,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 267bcc0..395607a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2014-01-04 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/59519
+ * gcc.dg/vect/pr59519-1.c: New test.
+ * gcc.dg/vect/pr59519-2.c: New test.
+
* gcc.target/i386/avx512f-vmovdqu32-1.c: Allow vmovdqu64 instead of
vmovdqu32.
diff --git a/gcc/testsuite/gcc.dg/vect/pr59519-1.c b/gcc/testsuite/gcc.dg/vect/pr59519-1.c
new file mode 100644
index 0000000..428d4ec
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr59519-1.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/59519 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+int a, b, c, d;
+
+void
+foo (void)
+{
+ for (; d; d++)
+ for (b = 0; b < 14; b++)
+ {
+ c |= 1;
+ if (a)
+ break;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/pr59519-2.c b/gcc/testsuite/gcc.dg/vect/pr59519-2.c
new file mode 100644
index 0000000..2b109d2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr59519-2.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/59519 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+struct S { int f0; } d;
+int a[8] = { 0 }, b, c, e;
+
+void
+foo (void)
+{
+ for (; e < 1; e++)
+ for (b = 0; b < 7; b++)
+ {
+ c |= (a[b + 1] != 0);
+ if (d.f0)
+ break;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index e8dbf4d..f686261 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -483,7 +483,18 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop,
if (!current_new_name)
continue;
}
- gcc_assert (get_current_def (current_new_name) == NULL_TREE);
+ tree new_name = get_current_def (current_new_name);
+ /* Because of peeled_chrec optimization it is possible that we have
+ set this earlier. Verify the PHI has the same value. */
+ if (new_name)
+ {
+ gimple phi = SSA_NAME_DEF_STMT (new_name);
+ gcc_assert (gimple_code (phi) == GIMPLE_PHI
+ && gimple_bb (phi) == *new_exit_bb
+ && (PHI_ARG_DEF_FROM_EDGE (phi, single_exit (loop))
+ == loop_arg));
+ continue;
+ }
set_current_def (current_new_name, PHI_RESULT (new_phi));
}