From: Jakub Jelinek Date: Sat, 4 Jan 2014 11:23:16 +0000 (+0100) Subject: re PR tree-optimization/59519 (ICE on valid code at -O3 on x86_64-linux-gnu in slpeel... X-Git-Tag: releases/gcc-4.9.0~1837 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=39719c84006d2dc2873cef482de74755925e631f;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index caae1f6f473a..9ce39739045a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2014-01-04 Jakub Jelinek + 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_mask): Emit vmovup{s,d} or vmovdqu* for misaligned_operand. (_loadu, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 267bcc0c7c60..395607aa3077 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2014-01-04 Jakub Jelinek + 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 000000000000..428d4ec32e7b --- /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 000000000000..2b109d2557d8 --- /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 e8dbf4daf468..f68626171d14 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)); }