+2013-05-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/56787
+ * tree-vect-data-refs.c (vect_analyze_data_refs): Drop clobbers
+ from the list of data references.
+ * tree-vect-loop.c (vect_determine_vectorization_factor): Skip
+ clobbers.
+ (vect_analyze_loop_operations): Likewise.
+ (vect_transform_loop): Remove clobbers.
+
2013-05-28 Martin Jambor <mjambor@suse.cz>
* tree-cfg.c (verify_expr): Verify that BIT_FIELD_REFs, IMAGPART_EXPRs
+2013-05-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/56787
+ * gcc.dg/vect/pr56787.c: New testcase.
+
2013-05-28 Janus Weil <janus@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
--- /dev/null
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+
+inline void
+bar (const float s[5], float z[3][5])
+{
+ float a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
+ float f = 1.0f / a;
+ float u = f * b, v = f * c, w = f * d;
+ float p = 0.4f * (e - 0.5f * (b * u + c * v + d * w));
+ z[0][3] = b * w;
+ z[1][3] = c * w;
+ z[2][3] = d * w + p;
+}
+
+void
+foo (unsigned long n, const float *__restrict u0,
+ const float *__restrict u1, const float *__restrict u2,
+ const float *__restrict u3, const float *__restrict u4,
+ const float *__restrict s0, const float *__restrict s1,
+ const float *__restrict s2, float *__restrict t3,
+ float *__restrict t4)
+{
+ unsigned long i;
+ for (i = 0; i < n; i++)
+ {
+ float u[5], f[3][5];
+ u[0] = u0[i]; u[1] = u1[i]; u[2] = u2[i]; u[3] = u3[i]; u[4] = u4[i];
+ bar (u, f);
+ t3[i] = s0[i] * f[0][3] + s1[i] * f[1][3] + s2[i] * f[2][3];
+ }
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
bool gather = false;
int vf;
+again:
if (!dr || !DR_REF (dr))
{
if (dump_enabled_p ())
stmt = DR_STMT (dr);
stmt_info = vinfo_for_stmt (stmt);
+ /* Discard clobbers from the dataref vector. We will remove
+ clobber stmts during vectorization. */
+ if (gimple_clobber_p (stmt))
+ {
+ if (i == datarefs.length () - 1)
+ {
+ datarefs.pop ();
+ break;
+ }
+ datarefs[i] = datarefs.pop ();
+ goto again;
+ }
+
/* Check that analysis of the data-ref succeeded. */
if (!DR_BASE_ADDRESS (dr) || !DR_OFFSET (dr) || !DR_INIT (dr)
|| !DR_STEP (dr))
gcc_assert (stmt_info);
/* Skip stmts which do not need to be vectorized. */
- if (!STMT_VINFO_RELEVANT_P (stmt_info)
- && !STMT_VINFO_LIVE_P (stmt_info))
+ if ((!STMT_VINFO_RELEVANT_P (stmt_info)
+ && !STMT_VINFO_LIVE_P (stmt_info))
+ || gimple_clobber_p (stmt))
{
if (STMT_VINFO_IN_PATTERN_P (stmt_info)
&& (pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info))
for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
{
gimple stmt = gsi_stmt (si);
- if (!vect_analyze_stmt (stmt, &need_to_vectorize, NULL))
+ if (!gimple_clobber_p (stmt)
+ && !vect_analyze_stmt (stmt, &need_to_vectorize, NULL))
return false;
}
} /* bbs */
if (transform_pattern_stmt)
stmt = pattern_stmt;
else
- stmt = gsi_stmt (si);
+ {
+ stmt = gsi_stmt (si);
+ /* During vectorization remove existing clobber stmts. */
+ if (gimple_clobber_p (stmt))
+ {
+ unlink_stmt_vdef (stmt);
+ gsi_remove (&si, true);
+ release_defs (stmt);
+ continue;
+ }
+ }
if (dump_enabled_p ())
{