This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR56778


This fixes PR56778 - a fallout of my vectorizer TLC regarding
dataref analysis.  The patch restores a check that disallows
runtime alias checks for gather loads (those are not loop
invariant).  It also fixes another possible source of issues.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied
yesterday already (forget to post the patch ...).

Richard.

2013-04-02  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56778
	* tree-vect-data-refs.c (vect_analyze_data_ref_dependence):
	Runtime alias tests are not supported for gather loads.
	* tree-vect-loop-manip.c (vect_loop_versioning): Insert
	stmts referenced from SSA operands before updating SSA form.

	* gcc.dg/torture/pr56778.c: New testcase.

Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c	(revision 197341)
--- gcc/tree-vect-data-refs.c	(working copy)
*************** vect_analyze_data_ref_dependence (struct
*** 280,285 ****
--- 280,302 ----
    /* Unknown data dependence.  */
    if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
      {
+       if (STMT_VINFO_GATHER_P (stmtinfo_a)
+ 	  || STMT_VINFO_GATHER_P (stmtinfo_b))
+ 	{
+ 	  if (dump_enabled_p ())
+ 	    {
+ 	      dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ 			       "versioning for alias not supported for: "
+ 			       "can't determine dependence between ");
+ 	      dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ 				 DR_REF (dra));
+ 	      dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+ 	      dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ 				 DR_REF (drb));
+ 	    }
+ 	  return false;
+ 	}
+ 
        if (dump_enabled_p ())
  	{
  	  dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vect_analyze_data_ref_dependence (struct
*** 299,304 ****
--- 316,338 ----
    /* Known data dependence.  */
    if (DDR_NUM_DIST_VECTS (ddr) == 0)
      {
+       if (STMT_VINFO_GATHER_P (stmtinfo_a)
+ 	  || STMT_VINFO_GATHER_P (stmtinfo_b))
+ 	{
+ 	  if (dump_enabled_p ())
+ 	    {
+ 	      dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ 			       "versioning for alias not supported for: "
+ 			       "bad dist vector for ");
+ 	      dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ 				 DR_REF (dra));
+ 	      dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+ 	      dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ 				 DR_REF (drb));
+ 	    }
+ 	  return false;
+ 	}
+ 
        if (dump_enabled_p ())
          {
            dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, 
Index: gcc/tree-vect-loop-manip.c
===================================================================
*** gcc/tree-vect-loop-manip.c	(revision 197341)
--- gcc/tree-vect-loop-manip.c	(working copy)
*************** vect_loop_versioning (loop_vec_info loop
*** 2476,2486 ****
  
    /* End loop-exit-fixes after versioning.  */
  
-   update_ssa (TODO_update_ssa);
    if (cond_expr_stmt_list)
      {
        cond_exp_gsi = gsi_last_bb (condition_bb);
        gsi_insert_seq_before (&cond_exp_gsi, cond_expr_stmt_list,
  			     GSI_SAME_STMT);
      }
  }
--- 2476,2486 ----
  
    /* End loop-exit-fixes after versioning.  */
  
    if (cond_expr_stmt_list)
      {
        cond_exp_gsi = gsi_last_bb (condition_bb);
        gsi_insert_seq_before (&cond_exp_gsi, cond_expr_stmt_list,
  			     GSI_SAME_STMT);
      }
+   update_ssa (TODO_update_ssa);
  }
Index: gcc/testsuite/gcc.dg/torture/pr56778.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr56778.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr56778.c	(working copy)
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ 
+ typedef struct {
+     float a,b,c;
+ } S;
+ 
+ S * arr[100];
+ 
+ void bar (float *in[], int n)
+ {
+   int i;
+   for (i=0; i<n; i++)
+     (*in)[i] = -arr[i]->b;
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]