diff options
author | Richard Guenther <rguenther@suse.de> | 2011-07-05 11:24:26 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-07-05 11:24:26 +0000 |
commit | 39becbac3d5c936b5cd5fa69d6f04685216f7e38 (patch) | |
tree | 65d44fb5fd726825cddd622e4483ffc45c59e88b /gcc/tree-vect-data-refs.c | |
parent | 08b3c764e8096983cbede38eecf7a50818c52114 (diff) | |
download | gcc-39becbac3d5c936b5cd5fa69d6f04685216f7e38.zip gcc-39becbac3d5c936b5cd5fa69d6f04685216f7e38.tar.gz gcc-39becbac3d5c936b5cd5fa69d6f04685216f7e38.tar.bz2 |
re PR tree-optimization/49518 (ICE in vect_enhance_data_refs_alignment, at tree-vect-data-refs.c:1555)
2011-07-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49518
PR tree-optimization/49628
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Skip
irrelevant and invariant data-references.
(vect_analyze_data_ref_access): For invariant loads clear the
group association.
* g++.dg/torture/pr49628.C: New testcase.
* gcc.dg/torture/pr49518.c: Likewise.
From-SVN: r175847
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 1a49423..2814738 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -1495,12 +1495,19 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) stmt = DR_STMT (dr); stmt_info = vinfo_for_stmt (stmt); + if (!STMT_VINFO_RELEVANT (stmt_info)) + continue; + /* For interleaving, only the alignment of the first access matters. */ if (STMT_VINFO_STRIDED_ACCESS (stmt_info) && GROUP_FIRST_ELEMENT (stmt_info) != stmt) continue; + /* For invariant accesses there is nothing to enhance. */ + if (integer_zerop (DR_STEP (dr))) + continue; + supportable_dr_alignment = vect_supportable_dr_alignment (dr, true); do_peeling = vector_alignment_reachable_p (dr); if (do_peeling) @@ -2304,7 +2311,10 @@ vect_analyze_data_ref_access (struct data_reference *dr) /* Allow invariant loads in loops. */ if (loop_vinfo && dr_step == 0) - return DR_IS_READ (dr); + { + GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = NULL; + return DR_IS_READ (dr); + } if (loop && nested_in_vect_loop_p (loop, stmt)) { |