This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR56778
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 3 Apr 2013 09:41:20 +0200 (CEST)
- Subject: [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;
+ }