From: Jakub Jelinek Date: Thu, 10 Nov 2011 08:29:52 +0000 (+0100) Subject: re PR tree-optimization/51000 (ICE: in vect_get_store_cost, at tree-vect-stmts.c... X-Git-Tag: releases/gcc-4.7.0~2277 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=78048b1c66c31b87770b8a29fa44fc291213fd9b;p=thirdparty%2Fgcc.git re PR tree-optimization/51000 (ICE: in vect_get_store_cost, at tree-vect-stmts.c:923 on powerpc-apple-darwin9) PR tree-optimization/51000 * tree-vect-patterns.c (vect_recog_bool_pattern): If adding a pattern stmt for a bool store, adjust DR_STMT too. Don't handle bool conversions to single bit precision lhs. * tree-vect-stmts.c (vect_remove_stores): If next is a pattern stmt, remove its related stmt and free its stmt_vinfo. (free_stmt_vec_info): Free also pattern stmt's vinfo and pattern def stmt's vinfo. * tree-vect-loop.c (destroy_loop_vec_info): Don't try to free pattern stmt's vinfo here. (vect_transform_loop): When calling vect_remove_stores, do gsi_next first and don't call gsi_remove. If not strided store, free stmt vinfo for gsi_stmt (si) rather than stmt. * gcc.dg/vect/pr51000.c: New test. From-SVN: r181250 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3252836f941..e3a268fd31a2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2011-11-10 Jakub Jelinek + + PR tree-optimization/51000 + * tree-vect-patterns.c (vect_recog_bool_pattern): If adding + a pattern stmt for a bool store, adjust DR_STMT too. + Don't handle bool conversions to single bit precision lhs. + * tree-vect-stmts.c (vect_remove_stores): If next is a pattern + stmt, remove its related stmt and free its stmt_vinfo. + (free_stmt_vec_info): Free also pattern stmt's vinfo and + pattern def stmt's vinfo. + * tree-vect-loop.c (destroy_loop_vec_info): Don't try to + free pattern stmt's vinfo here. + (vect_transform_loop): When calling vect_remove_stores, + do gsi_next first and don't call gsi_remove. If not strided + store, free stmt vinfo for gsi_stmt (si) rather than stmt. + 2011-11-09 Jakub Jelinek PR target/50911 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c5004a413909..31f53066f0a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-10 Jakub Jelinek + + PR tree-optimization/51000 + * gcc.dg/vect/pr51000.c: New test. + 2011-11-09 Paolo Carlini PR c++/50837 diff --git a/gcc/testsuite/gcc.dg/vect/pr51000.c b/gcc/testsuite/gcc.dg/vect/pr51000.c new file mode 100644 index 000000000000..75af2d8a2983 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr51000.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +_Bool a[2048]; +int b[2048]; + +void +foo () +{ + int i; + for (i = 0; i < 2048; i += 4) + { + a[i] = b[i] <= 10; + a[i + 3] = b[i + 1] <= 10; + a[i + 2] = b[i + 2] <= 10; + a[i + 1] = b[i + 3] <= 10; + } +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index dca1c34a1f64..fb15d6e3d03d 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -872,21 +872,8 @@ destroy_loop_vec_info (loop_vec_info loop_vinfo, bool clean_stmts) for (si = gsi_start_bb (bb); !gsi_end_p (si); ) { gimple stmt = gsi_stmt (si); - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - - if (stmt_info) - { - /* Check if this statement has a related "pattern stmt" - (introduced by the vectorizer during the pattern recognition - pass). Free pattern's stmt_vec_info. */ - if (STMT_VINFO_IN_PATTERN_P (stmt_info) - && vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info))) - free_stmt_vec_info (STMT_VINFO_RELATED_STMT (stmt_info)); - - /* Free stmt_vec_info. */ - free_stmt_vec_info (stmt); - } - + /* Free stmt_vec_info. */ + free_stmt_vec_info (stmt); gsi_next (&si); } } @@ -5349,14 +5336,14 @@ vect_transform_loop (loop_vec_info loop_vinfo) /* Interleaving. If IS_STORE is TRUE, the vectorization of the interleaving chain was completed - free all the stores in the chain. */ + gsi_next (&si); vect_remove_stores (GROUP_FIRST_ELEMENT (stmt_info)); - gsi_remove (&si, true); continue; } else { /* Free the attached stmt_vec_info and remove the stmt. */ - free_stmt_vec_info (stmt); + free_stmt_vec_info (gsi_stmt (si)); gsi_remove (&si, true); continue; } diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 19b75e9e4655..d260e801bca5 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -2041,7 +2041,8 @@ vect_recog_bool_pattern (VEC (gimple, heap) **stmts, tree *type_in, rhs_code = gimple_assign_rhs_code (last_stmt); if (CONVERT_EXPR_CODE_P (rhs_code)) { - if (TREE_CODE (TREE_TYPE (lhs)) != INTEGER_TYPE) + if (TREE_CODE (TREE_TYPE (lhs)) != INTEGER_TYPE + || TYPE_PRECISION (TREE_TYPE (lhs)) == 1) return NULL; vectype = get_vectype_for_scalar_type (TREE_TYPE (lhs)); if (vectype == NULL_TREE) @@ -2096,6 +2097,7 @@ vect_recog_bool_pattern (VEC (gimple, heap) **stmts, tree *type_in, STMT_VINFO_DR_STEP (pattern_stmt_info) = STMT_VINFO_DR_STEP (stmt_vinfo); STMT_VINFO_DR_ALIGNED_TO (pattern_stmt_info) = STMT_VINFO_DR_ALIGNED_TO (stmt_vinfo); + DR_STMT (STMT_VINFO_DATA_REF (stmt_vinfo)) = pattern_stmt; *type_out = vectype; *type_in = vectype; VEC_safe_push (gimple, heap, *stmts, last_stmt); diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 705e7df531ac..abccd923b44f 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -5567,10 +5567,14 @@ vect_remove_stores (gimple first_stmt) while (next) { + stmt_vec_info stmt_info = vinfo_for_stmt (next); + + tmp = GROUP_NEXT_ELEMENT (stmt_info); + if (is_pattern_stmt_p (stmt_info)) + next = STMT_VINFO_RELATED_STMT (stmt_info); /* Free the attached stmt_vec_info and remove the stmt. */ next_si = gsi_for_stmt (next); gsi_remove (&next_si, true); - tmp = GROUP_NEXT_ELEMENT (vinfo_for_stmt (next)); free_stmt_vec_info (next); next = tmp; } @@ -5660,6 +5664,22 @@ free_stmt_vec_info (gimple stmt) if (!stmt_info) return; + /* Check if this statement has a related "pattern stmt" + (introduced by the vectorizer during the pattern recognition + pass). Free pattern's stmt_vec_info and def stmt's stmt_vec_info + too. */ + if (STMT_VINFO_IN_PATTERN_P (stmt_info)) + { + stmt_vec_info patt_info + = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)); + if (patt_info) + { + if (STMT_VINFO_PATTERN_DEF_STMT (patt_info)) + free_stmt_vec_info (STMT_VINFO_PATTERN_DEF_STMT (patt_info)); + free_stmt_vec_info (STMT_VINFO_RELATED_STMT (stmt_info)); + } + } + VEC_free (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmt_info)); set_vinfo_for_stmt (stmt, NULL); free (stmt_info);