diff mbox

Fix PR53185 (vectorizer segfault)

Message ID Pine.LNX.4.64.1205091434320.25409@wotan.suse.de
State New
Headers show

Commit Message

Michael Matz May 9, 2012, 12:38 p.m. UTC
Hi,

the current code for strided loads can't deal with the situation when a 
prologue loop (peeling for alignment) is created after analyzing the data 
refs.  There are multiple issues (non-constant steps in DRs mainly), so 
this is a simple stop gap.

Regtesting on x86_64-linux (all langs) in progress.  Okay for trunk?


Ciao,
Michael.
--------------------
	PR tree-optimization/53185
	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable
	peeling when we see strided loads.

testsuite/
	* gcc.dg/vect/pr53185.c: New test.

Comments

Richard Biener May 9, 2012, 1:24 p.m. UTC | #1
On Wed, May 9, 2012 at 2:38 PM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> the current code for strided loads can't deal with the situation when a
> prologue loop (peeling for alignment) is created after analyzing the data
> refs.  There are multiple issues (non-constant steps in DRs mainly), so
> this is a simple stop gap.
>
> Regtesting on x86_64-linux (all langs) in progress.  Okay for trunk?

Ok.

Thanks,
Richard.

>
> Ciao,
> Michael.
> --------------------
>        PR tree-optimization/53185
>        * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable
>        peeling when we see strided loads.
>
> testsuite/
>        * gcc.dg/vect/pr53185.c: New test.
>
> Index: tree-vect-data-refs.c
> ===================================================================
> --- tree-vect-data-refs.c       (revision 187287)
> +++ tree-vect-data-refs.c       (working copy)
> @@ -1507,6 +1507,17 @@ vect_enhance_data_refs_alignment (loop_v
>           && GROUP_FIRST_ELEMENT (stmt_info) != stmt)
>         continue;
>
> +      /* FORNOW: Any strided load prevents peeling.  The induction
> +         variable analysis will fail when the prologue loop is generated,
> +        and so we can't generate the new base for the pointer.  */
> +      if (STMT_VINFO_STRIDE_LOAD_P (stmt_info))
> +       {
> +         if (vect_print_dump_info (REPORT_DETAILS))
> +           fprintf (vect_dump, "strided load prevents peeling");
> +         do_peeling = false;
> +         break;
> +       }
> +
>       /* For invariant accesses there is nothing to enhance.  */
>       if (integer_zerop (DR_STEP (dr)))
>        continue;
> Index: testsuite/gcc.dg/vect/pr53185.c
> ===================================================================
> --- testsuite/gcc.dg/vect/pr53185.c     (revision 0)
> +++ testsuite/gcc.dg/vect/pr53185.c     (revision 0)
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -ftree-vectorize" } */
> +unsigned short a, e;
> +int *b, *d;
> +int c;
> +extern int fn2();
> +void fn1 () {
> +  void *f;
> +  for (;;) {
> +    fn2 ();
> +    b = f;
> +    e = 0;
> +    for (; e < a; ++e)
> +      b[e] = d[e * c];
> +  }
> +}
diff mbox

Patch

Index: tree-vect-data-refs.c
===================================================================
--- tree-vect-data-refs.c	(revision 187287)
+++ tree-vect-data-refs.c	(working copy)
@@ -1507,6 +1507,17 @@  vect_enhance_data_refs_alignment (loop_v
           && GROUP_FIRST_ELEMENT (stmt_info) != stmt)
         continue;
 
+      /* FORNOW: Any strided load prevents peeling.  The induction
+         variable analysis will fail when the prologue loop is generated,
+	 and so we can't generate the new base for the pointer.  */
+      if (STMT_VINFO_STRIDE_LOAD_P (stmt_info))
+	{
+	  if (vect_print_dump_info (REPORT_DETAILS))
+	    fprintf (vect_dump, "strided load prevents peeling");
+	  do_peeling = false;
+	  break;
+	}
+
       /* For invariant accesses there is nothing to enhance.  */
       if (integer_zerop (DR_STEP (dr)))
 	continue;
Index: testsuite/gcc.dg/vect/pr53185.c
===================================================================
--- testsuite/gcc.dg/vect/pr53185.c	(revision 0)
+++ testsuite/gcc.dg/vect/pr53185.c	(revision 0)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+unsigned short a, e;
+int *b, *d;
+int c;
+extern int fn2();
+void fn1 () {
+  void *f;
+  for (;;) {
+    fn2 ();
+    b = f;
+    e = 0;
+    for (; e < a; ++e)
+      b[e] = d[e * c];
+  }
+}