diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-01-04 12:23:16 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-01-04 12:23:16 +0100 |
commit | 39719c84006d2dc2873cef482de74755925e631f (patch) | |
tree | 6ad38258eeb4e950de82db56f085a0ed7cf7ff77 /gcc/tree-vect-loop-manip.c | |
parent | dad5ed2eb152e85ae2ebb3582d57d895488011a4 (diff) | |
download | gcc-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/tree-vect-loop-manip.c')
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 13 |
1 files changed, 12 insertions, 1 deletions
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)); } |