[PATCH] Fix PR79887

Richard Biener rguenther@suse.de
Tue Mar 7 09:42:00 GMT 2017


On Tue, 7 Mar 2017, Christophe Lyon wrote:

> Hi Richard,
> 
> 
> On 6 March 2017 at 13:05, Richard Biener <rguenther@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  <rguenther@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  <rguenther@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;
 }
 



More information about the Gcc-patches mailing list