diff mbox

Fix vectorizer ICEs with calls with MEM_REF arguments (PR tree-optimization/51485)

Message ID 20111209170854.GZ1957@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 9, 2011, 5:08 p.m. UTC
Hi!

As mentioned in the PR, we ICE on the following testcase, because
there are DRs in a GIMPLE_CALL stmt and when there is just one, we
compute vectype for the call as if it were a load or store, but during
computation of vectorization factor we only consider the return value
of the call.  As such calls are not vectorizable anyway, the following
patch just gives up on them.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk
(and with the if (bb_vinfo)/if (gather) parts removed for 4.6 too)?

2011-12-09  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/51485
	* tree-vect-data-refs.c (vect_analyze_data_refs): Give up on
	DRs in call stmts.

	* g++.dg/vect/pr51485.cc: New test.


	Jakub

Comments

Ira Rosen Dec. 11, 2011, 7:31 a.m. UTC | #1
On 9 December 2011 19:08, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> As mentioned in the PR, we ICE on the following testcase, because
> there are DRs in a GIMPLE_CALL stmt and when there is just one, we
> compute vectype for the call as if it were a load or store, but during
> computation of vectorization factor we only consider the return value
> of the call.  As such calls are not vectorizable anyway, the following
> patch just gives up on them.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk
> (and with the if (bb_vinfo)/if (gather) parts removed for 4.6 too)?

OK for trunk.

Thanks,
Ira


>
> 2011-12-09  Jakub Jelinek  <jakub@redhat.com>
>
>        PR tree-optimization/51485
>        * tree-vect-data-refs.c (vect_analyze_data_refs): Give up on
>        DRs in call stmts.
>
>        * g++.dg/vect/pr51485.cc: New test.
>
> --- gcc/tree-vect-data-refs.c.jj        2011-12-02 01:52:26.325893329 +0100
> +++ gcc/tree-vect-data-refs.c   2011-12-09 13:27:29.726668859 +0100
> @@ -2896,6 +2896,26 @@ vect_analyze_data_refs (loop_vec_info lo
>           return false;
>         }
>
> +      if (is_gimple_call (stmt))
> +       {
> +         if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
> +           {
> +             fprintf (vect_dump, "not vectorized: dr in a call ");
> +             print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
> +           }
> +
> +         if (bb_vinfo)
> +           {
> +             STMT_VINFO_VECTORIZABLE (stmt_info) = false;
> +             stop_bb_analysis = true;
> +             continue;
> +           }
> +
> +         if (gather)
> +           free_data_ref (dr);
> +         return false;
> +       }
> +
>       /* Update DR field in stmt_vec_info struct.  */
>
>       /* If the dataref is in an inner-loop of the loop that is considered for
> --- gcc/testsuite/g++.dg/vect/pr51485.cc.jj     2011-12-09 13:28:45.155281405 +0100
> +++ gcc/testsuite/g++.dg/vect/pr51485.cc        2011-12-09 13:28:57.692205773 +0100
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +
> +struct A { A (); unsigned int a; };
> +double bar (A a) throw () __attribute__((pure));
> +
> +void
> +foo (unsigned int x, double *y, A *z)
> +{
> +  unsigned int i;
> +  for (i = 0; i < x; i++)
> +    y[i] = bar (z[i]);
> +}
> +
> +/* { dg-final { cleanup-tree-dump "vect" } } */
>
>        Jakub
Richard Biener Dec. 12, 2011, 8:44 a.m. UTC | #2
On Sun, 11 Dec 2011, Ira Rosen wrote:

> On 9 December 2011 19:08, Jakub Jelinek <jakub@redhat.com> wrote:
> > Hi!
> >
> > As mentioned in the PR, we ICE on the following testcase, because
> > there are DRs in a GIMPLE_CALL stmt and when there is just one, we
> > compute vectype for the call as if it were a load or store, but during
> > computation of vectorization factor we only consider the return value
> > of the call.  As such calls are not vectorizable anyway, the following
> > patch just gives up on them.
> >
> > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk
> > (and with the if (bb_vinfo)/if (gather) parts removed for 4.6 too)?
> 
> OK for trunk.

Also for the branch.

Thanks,
Richard.

> Thanks,
> Ira
> 
> 
> >
> > 2011-12-09  Jakub Jelinek  <jakub@redhat.com>
> >
> >        PR tree-optimization/51485
> >        * tree-vect-data-refs.c (vect_analyze_data_refs): Give up on
> >        DRs in call stmts.
> >
> >        * g++.dg/vect/pr51485.cc: New test.
> >
> > --- gcc/tree-vect-data-refs.c.jj        2011-12-02 01:52:26.325893329 +0100
> > +++ gcc/tree-vect-data-refs.c   2011-12-09 13:27:29.726668859 +0100
> > @@ -2896,6 +2896,26 @@ vect_analyze_data_refs (loop_vec_info lo
> >           return false;
> >         }
> >
> > +      if (is_gimple_call (stmt))
> > +       {
> > +         if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
> > +           {
> > +             fprintf (vect_dump, "not vectorized: dr in a call ");
> > +             print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
> > +           }
> > +
> > +         if (bb_vinfo)
> > +           {
> > +             STMT_VINFO_VECTORIZABLE (stmt_info) = false;
> > +             stop_bb_analysis = true;
> > +             continue;
> > +           }
> > +
> > +         if (gather)
> > +           free_data_ref (dr);
> > +         return false;
> > +       }
> > +
> >       /* Update DR field in stmt_vec_info struct.  */
> >
> >       /* If the dataref is in an inner-loop of the loop that is considered for
> > --- gcc/testsuite/g++.dg/vect/pr51485.cc.jj     2011-12-09 13:28:45.155281405 +0100
> > +++ gcc/testsuite/g++.dg/vect/pr51485.cc        2011-12-09 13:28:57.692205773 +0100
> > @@ -0,0 +1,14 @@
> > +/* { dg-do compile } */
> > +
> > +struct A { A (); unsigned int a; };
> > +double bar (A a) throw () __attribute__((pure));
> > +
> > +void
> > +foo (unsigned int x, double *y, A *z)
> > +{
> > +  unsigned int i;
> > +  for (i = 0; i < x; i++)
> > +    y[i] = bar (z[i]);
> > +}
> > +
> > +/* { dg-final { cleanup-tree-dump "vect" } } */
> >
> >        Jakub
> 
>
diff mbox

Patch

--- gcc/tree-vect-data-refs.c.jj	2011-12-02 01:52:26.325893329 +0100
+++ gcc/tree-vect-data-refs.c	2011-12-09 13:27:29.726668859 +0100
@@ -2896,6 +2896,26 @@  vect_analyze_data_refs (loop_vec_info lo
           return false;
         }
 
+      if (is_gimple_call (stmt))
+	{
+	  if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
+	    {
+	      fprintf (vect_dump, "not vectorized: dr in a call ");
+	      print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
+	    }
+
+	  if (bb_vinfo)
+	    {
+	      STMT_VINFO_VECTORIZABLE (stmt_info) = false;
+	      stop_bb_analysis = true;
+	      continue;
+	    }
+
+	  if (gather)
+	    free_data_ref (dr);
+	  return false;
+	}
+
       /* Update DR field in stmt_vec_info struct.  */
 
       /* If the dataref is in an inner-loop of the loop that is considered for
--- gcc/testsuite/g++.dg/vect/pr51485.cc.jj	2011-12-09 13:28:45.155281405 +0100
+++ gcc/testsuite/g++.dg/vect/pr51485.cc	2011-12-09 13:28:57.692205773 +0100
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+
+struct A { A (); unsigned int a; };
+double bar (A a) throw () __attribute__((pure));
+
+void
+foo (unsigned int x, double *y, A *z)
+{
+  unsigned int i;
+  for (i = 0; i < x; i++)
+    y[i] = bar (z[i]);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */