aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2010-04-22 18:03:01 +0000
committerIra Rosen <irar@gcc.gnu.org>2010-04-22 18:03:01 +0000
commit74500b3e10a9980a4719ed570ae45d8c3bc811c0 (patch)
tree144fa12816f0643bd8e04966503f8528729a0649 /gcc
parent8e80fcacfae2e4f30100fe3a1073dec81d7fa51e (diff)
downloadgcc-74500b3e10a9980a4719ed570ae45d8c3bc811c0.zip
gcc-74500b3e10a9980a4719ed570ae45d8c3bc811c0.tar.gz
gcc-74500b3e10a9980a4719ed570ae45d8c3bc811c0.tar.bz2
re PR tree-optimization/43842 (ice in vect_create_epilog_for_reduction)
PR tree-optimization/43842 * tree-vect-loop.c (vect_create_epilog_for_reduction): Handle loop unrolling in update of exit phis. Fix comment. * tree-vect-slp.c (vect_analyze_slp): Check that there are at least two reduction statements in the loop before starting SLP analysis. From-SVN: r158650
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr43842.c55
-rw-r--r--gcc/tree-vect-loop.c14
-rw-r--r--gcc/tree-vect-slp.c2
5 files changed, 80 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5d6a5df..91cc236 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2010-04-22 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/43482
+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Handle
+ loop unrolling in update of exit phis. Fix comment.
+ * tree-vect-slp.c (vect_analyze_slp): Check that there are at
+ least two reduction statements in the loop before starting SLP
+ analysis.
+
2010-04-22 Nick Clifton <nickc@redhat.com>
* config/stormy16/stormy16-lib2.c (__ucmpsi2): Fix thinko.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 41156bb..d21af46 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-22 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/43482
+ * gcc.dg/vect/pr43842.c: New test.
+
2010-04-22 Bernd Schmidt <bernds@codesourcery.com>
* gcc.target/i386/wmul-1.c: Add dg-require-effective-target ilp32.
diff --git a/gcc/testsuite/gcc.dg/vect/pr43842.c b/gcc/testsuite/gcc.dg/vect/pr43842.c
new file mode 100644
index 0000000..593404f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr43842.c
@@ -0,0 +1,55 @@
+/* { dg-do compile } */
+
+typedef char int8_t;
+typedef short int int16_t;
+typedef int int32_t;
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+typedef unsigned int uint32_t;
+
+static int16_t
+safe_rshift_func_int16_t_s_u (int16_t left, unsigned int right)
+{
+ return left || right >= 1 * 8 ? left : left >> right;
+}
+
+static int8_t
+safe_rshift_func_int8_t_s_u (int8_t left, unsigned int right)
+{
+ return left || right >= 1 * 8 ? left : left >> right;
+}
+
+
+static uint32_t
+safe_add_func_uint32_t_u_u (uint32_t ui1, uint16_t ui2)
+{
+ return ui1 + ui2;
+}
+
+int16_t g_4;
+int8_t g_4_8;
+uint32_t g_9[1];
+uint32_t g_9_8[2];
+int161 (void)
+{
+ int32_t l_2;
+
+ for (l_2 = -25; l_2; l_2 = safe_add_func_uint32_t_u_u (l_2, 1))
+ g_9[0] ^= safe_rshift_func_int16_t_s_u (g_4, 1);
+}
+
+int81 (void)
+{
+ int32_t l_2;
+
+ for (l_2 = -25; l_2; l_2 = safe_add_func_uint32_t_u_u (l_2, 1))
+ {
+ g_9[0] ^= safe_rshift_func_int8_t_s_u (g_4_8, 1);
+ g_9[1] ^= safe_rshift_func_int8_t_s_u (g_4_8, 1);
+ }
+
+ return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index e6e9008..83b823d 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2961,7 +2961,7 @@ vect_create_epilog_for_reduction (VEC (tree, heap) *vect_defs, gimple stmt,
enum vect_def_type dt = vect_unknown_def_type;
int j, i;
VEC (tree, heap) *scalar_results = NULL;
- int group_size = 1, k, ratio;
+ unsigned int group_size = 1, k, ratio;
VEC (tree, heap) *vec_initial_defs = NULL;
VEC (gimple, heap) *phis;
@@ -3439,7 +3439,8 @@ vect_finalize_reduction:
v_out2 = reduce <v_out1>
s_out3 = extract_field <v_out2, 0>
s_out4 = adjust_result <s_out3>
- use <s_out4> */
+ use <s_out4>
+ use <s_out4> */
/* In SLP we may have several statements in NEW_PHIS and REDUCTION_PHIS (in
case that GROUP_SIZE is greater than vectorization factor). Therefore, we
@@ -3447,8 +3448,13 @@ vect_finalize_reduction:
(GROUP_SIZE / number of new vector stmts) scalar results correspond to
the first vector stmt, etc.
(RATIO is equal to (GROUP_SIZE / number of new vector stmts)). */
- ratio = group_size / VEC_length (gimple, new_phis);
- gcc_assert (!(group_size % VEC_length (gimple, new_phis)));
+ if (group_size > VEC_length (gimple, new_phis))
+ {
+ ratio = group_size / VEC_length (gimple, new_phis);
+ gcc_assert (!(group_size % VEC_length (gimple, new_phis)));
+ }
+ else
+ ratio = 1;
for (k = 0; k < group_size; k++)
{
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 99a865f..6949ebd 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -1213,7 +1213,7 @@ vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
}
/* Find SLP sequences starting from groups of reductions. */
- if (loop_vinfo && VEC_length (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo))
+ if (loop_vinfo && VEC_length (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo)) > 1
&& vect_analyze_slp_instance (loop_vinfo, bb_vinfo,
VEC_index (gimple, reductions, 0)))
ok = true;