From 97af59b2a431dd25e40d19eba669a62814bf7b7a Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 5 Aug 2015 07:48:34 +0000 Subject: [PATCH] re PR tree-optimization/67109 (ICE at -O3 on x86_64-linux-gnu in vect_analyze_slp_instance, at tree-vect-slp.c:1793) 2015-08-05 Richard Biener 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. * gcc.dg/torture/pr67109.c: New testcase. * gcc.dg/vect/vect-119.c: Adjust. From-SVN: r226610 --- gcc/ChangeLog | 11 ++++++ gcc/testsuite/ChangeLog | 6 +++ gcc/testsuite/gcc.dg/torture/pr67109.c | 19 +++++++++ gcc/testsuite/gcc.dg/vect/vect-119.c | 2 +- gcc/tree-vect-data-refs.c | 54 +++++++++++++++++++++++--- 5 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr67109.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09a89eef409..bafabb449fe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-08-05 Richard Biener + + 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 PR middle-end/67107 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a5d6f932ae..82aa267d42d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-08-05 Richard Biener + + PR tree-optimization/67109 + * gcc.dg/torture/pr67109.c: New testcase. + * gcc.dg/vect/vect-119.c: Adjust. + 2015-08-05 Richard Biener PR middle-end/67107 diff --git a/gcc/testsuite/gcc.dg/torture/pr67109.c b/gcc/testsuite/gcc.dg/torture/pr67109.c new file mode 100644 index 00000000000..46df1bfa54f --- /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 1e5bea90311..aa8c3002bff 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 80df9dfe52e..f1eaef40048 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)); -- 2.30.2