On Tue, 7 Mar 2017, Christophe Lyon wrote: > Hi Richard, > > > On 6 March 2017 at 13:05, Richard Biener <rguent...@suse.de> wrote: > > > > This fixes a crash when we try to re-use a folded loop_vectorized_call > > when vectorizing an epilogue. > > > > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. > > > > Richard. > > > > 2017-03-06 Richard Biener <rguent...@suse.de> > > > > PR tree-optimization/79894 > > * tree-vectorizer.c (vectorize_loops): Set loop_vectorized_call > > to NULL after folding it. > > > > * gcc.dg/vect/pr79887.c: New testcase. > > > > The new testcase causes an ICE on arm-* targets. > > The backtrace is as follows: > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/vect/pr79887.c: > In function 'foo': > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/vect/pr79887.c:8:1: > error: control flow in the middle of basic block 10 > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/vect/pr79887.c:8:1: > error: wrong outgoing edge flags at end of bb 10 > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/vect/pr79887.c:8:1: > internal compiler error: verify_flow_info failed > 0x6b0205 verify_flow_info() > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfghooks.c:260 > 0xb9a794 checking_verify_flow_info > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfghooks.h:198 > 0xb9a794 cleanup_tree_cfg_noloop > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:774 > 0xb9a794 cleanup_tree_cfg() > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-cfgcleanup.c:820 > 0xa5af54 execute_function_todo > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1919 > 0xa5aca5 execute_todo > /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:2016
Thanks for reporting - prologue vectorization seems to hit a latent bug where the vectorizer (rightfully) assumes pre-headers but does not maintain them. Bootstrap / regtest in progress on x86_64-unknown-linux-gnu. Richard. 2017-03-07 Richard Biener <rguent...@suse.de> * tree-vect-loop-manip.c (slpeel_add_loop_guard): Preserve preheaders. Index: gcc/tree-vect-loop-manip.c =================================================================== --- gcc/tree-vect-loop-manip.c (revision 245947) +++ gcc/tree-vect-loop-manip.c (working copy) @@ -569,6 +569,11 @@ slpeel_add_loop_guard (basic_block guard enter_e->count -= new_e->count; enter_e->probability = inverse_probability (probability); set_immediate_dominator (CDI_DOMINATORS, guard_to, dom_bb); + + /* Split enter_e to preserve LOOPS_HAVE_PREHEADERS. */ + if (enter_e->dest->loop_father->header == enter_e->dest) + split_edge (enter_e); + return new_e; }