aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr67109.c19
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-119.c2
-rw-r--r--gcc/tree-vect-data-refs.c54
5 files changed, 85 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 09a89ee..bafabb4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2015-08-05 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/67109
+ * tree-vect-data-refs.c (vect_analyze_group_access_1): Check
+ against too big groups. Print whether this is a load or store
+ group. Rename from ...
+ (vect_analyze_group_access): ... this which is now a wrapper
+ dissolving an invalid group.
+ (vect_analyze_data_ref_accesses): Print whether this is a load
+ or store group.
+
+2015-08-05 Richard Biener <rguenther@suse.de>
+
PR middle-end/67107
* match.pd: Guard const_binop result checking against NULL_TREE
result.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1a5d6f9..82aa267 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2015-08-05 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/67109
+ * gcc.dg/torture/pr67109.c: New testcase.
+ * gcc.dg/vect/vect-119.c: Adjust.
+
+2015-08-05 Richard Biener <rguenther@suse.de>
+
PR middle-end/67107
* gcc.dg/pr67107.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr67109.c b/gcc/testsuite/gcc.dg/torture/pr67109.c
new file mode 100644
index 0000000..46df1bf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr67109.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wno-aggressive-loop-optimizations" } */
+
+unsigned int a;
+int b[1], c, d;
+
+void
+fn1 ()
+{
+ for (; d;)
+ {
+ a = c = 0;
+ for (; c < 5; c++)
+ {
+ b[a] ^= 1;
+ a--;
+ }
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-119.c b/gcc/testsuite/gcc.dg/vect/vect-119.c
index 1e5bea9..aa8c300 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-119.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-119.c
@@ -25,4 +25,4 @@ unsigned int foo (const unsigned int x[OUTER][INNER][2])
return sum;
}
-/* { dg-final { scan-tree-dump-times "Detected interleaving of size 2" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Detected interleaving load of size 2" 1 "vect" } } */
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 80df9df..f1eaef4 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -2012,10 +2012,11 @@ vect_analyze_data_refs_alignment (loop_vec_info loop_vinfo,
/* Analyze groups of accesses: check that DR belongs to a group of
accesses of legal size, step, etc. Detect gaps, single element
interleaving, and other special cases. Set grouped access info.
- Collect groups of strided stores for further use in SLP analysis. */
+ Collect groups of strided stores for further use in SLP analysis.
+ Worker for vect_analyze_group_access. */
static bool
-vect_analyze_group_access (struct data_reference *dr)
+vect_analyze_group_access_1 (struct data_reference *dr)
{
tree step = DR_STEP (dr);
tree scalar_type = TREE_TYPE (DR_REF (dr));
@@ -2182,6 +2183,14 @@ vect_analyze_group_access (struct data_reference *dr)
if (groupsize == 0)
groupsize = count + gaps;
+ if (groupsize > UINT_MAX)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "group is too large\n");
+ return false;
+ }
+
/* Check that the size of the interleaving is equal to count for stores,
i.e., that there are no gaps. */
if (groupsize != count
@@ -2203,13 +2212,18 @@ vect_analyze_group_access (struct data_reference *dr)
if (dump_enabled_p ())
{
dump_printf_loc (MSG_NOTE, vect_location,
- "Detected interleaving of size %d starting with ",
- (int)groupsize);
+ "Detected interleaving ");
+ if (DR_IS_READ (dr))
+ dump_printf (MSG_NOTE, "load ");
+ else
+ dump_printf (MSG_NOTE, "store ");
+ dump_printf (MSG_NOTE, "of size %u starting with ",
+ (unsigned)groupsize);
dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0);
if (GROUP_GAP (vinfo_for_stmt (stmt)) != 0)
dump_printf_loc (MSG_NOTE, vect_location,
- "There is a gap of %d elements after the group\n",
- (int)GROUP_GAP (vinfo_for_stmt (stmt)));
+ "There is a gap of %u elements after the group\n",
+ GROUP_GAP (vinfo_for_stmt (stmt)));
}
/* SLP: create an SLP data structure for every interleaving group of
@@ -2249,6 +2263,30 @@ vect_analyze_group_access (struct data_reference *dr)
return true;
}
+/* Analyze groups of accesses: check that DR belongs to a group of
+ accesses of legal size, step, etc. Detect gaps, single element
+ interleaving, and other special cases. Set grouped access info.
+ Collect groups of strided stores for further use in SLP analysis. */
+
+static bool
+vect_analyze_group_access (struct data_reference *dr)
+{
+ if (!vect_analyze_group_access_1 (dr))
+ {
+ /* Dissolve the group if present. */
+ gimple next, stmt = GROUP_FIRST_ELEMENT (vinfo_for_stmt (DR_STMT (dr)));
+ while (stmt)
+ {
+ stmt_vec_info vinfo = vinfo_for_stmt (stmt);
+ next = GROUP_NEXT_ELEMENT (vinfo);
+ GROUP_FIRST_ELEMENT (vinfo) = NULL;
+ GROUP_NEXT_ELEMENT (vinfo) = NULL;
+ stmt = next;
+ }
+ return false;
+ }
+ return true;
+}
/* Analyze the access pattern of the data-reference DR.
In case of non-consecutive accesses call vect_analyze_group_access() to
@@ -2598,6 +2636,10 @@ vect_analyze_data_ref_accesses (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
{
dump_printf_loc (MSG_NOTE, vect_location,
"Detected interleaving ");
+ if (DR_IS_READ (dra))
+ dump_printf (MSG_NOTE, "load ");
+ else
+ dump_printf (MSG_NOTE, "store ");
dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dra));
dump_printf (MSG_NOTE, " and ");
dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (drb));