aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-05-29 14:40:16 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-05-29 14:40:16 +0000
commit508ef0c675b409e2c92c8078a2dc5043da88db1b (patch)
treedefff990b81b71950b63227548cb841b34adf3bd /gcc/tree-vect-data-refs.c
parent073a899888791eb53e4454236e3463b6619bfd9b (diff)
downloadgcc-508ef0c675b409e2c92c8078a2dc5043da88db1b.zip
gcc-508ef0c675b409e2c92c8078a2dc5043da88db1b.tar.gz
gcc-508ef0c675b409e2c92c8078a2dc5043da88db1b.tar.bz2
re PR tree-optimization/53516 (Vectorization and memset recognition miscompile bitfield stores)
2012-05-29 Richard Guenther <rguenther@suse.de> PR tree-optimization/53516 * tree-data-ref.c (stmt_with_adjacent_zero_store_dr_p): Reject bitfield accesses. * tree-vect-data-refs.c (vect_analyze_data_refs): Likewise. * gcc.dg/torture/pr53516.c: New testcase. From-SVN: r187961
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index a5ed053..e34f41a 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -2972,10 +2972,6 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo,
return false;
}
- base = unshare_expr (DR_BASE_ADDRESS (dr));
- offset = unshare_expr (DR_OFFSET (dr));
- init = unshare_expr (DR_INIT (dr));
-
if (stmt_can_throw_internal (stmt))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
@@ -2997,6 +2993,32 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo,
return false;
}
+ if (TREE_CODE (DR_REF (dr)) == COMPONENT_REF
+ && DECL_BIT_FIELD (TREE_OPERAND (DR_REF (dr), 1)))
+ {
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
+ {
+ fprintf (vect_dump, "not vectorized: statement is bitfield "
+ "access ");
+ print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
+ }
+
+ if (bb_vinfo)
+ {
+ STMT_VINFO_VECTORIZABLE (stmt_info) = false;
+ stop_bb_analysis = true;
+ continue;
+ }
+
+ if (gather)
+ free_data_ref (dr);
+ return false;
+ }
+
+ base = unshare_expr (DR_BASE_ADDRESS (dr));
+ offset = unshare_expr (DR_OFFSET (dr));
+ init = unshare_expr (DR_INIT (dr));
+
if (is_gimple_call (stmt))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))