diff options
author | Richard Guenther <rguenther@suse.de> | 2012-05-29 14:40:16 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-05-29 14:40:16 +0000 |
commit | 508ef0c675b409e2c92c8078a2dc5043da88db1b (patch) | |
tree | defff990b81b71950b63227548cb841b34adf3bd /gcc/tree-vect-data-refs.c | |
parent | 073a899888791eb53e4454236e3463b6619bfd9b (diff) | |
download | gcc-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.c | 30 |
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)) |