diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-06-18 09:39:13 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-06-18 09:39:13 +0000 |
commit | c1bee668987f371617586edafa0dfccf04162a83 (patch) | |
tree | da75024fa87089bd1e346a57d5ce2782e4667380 /gcc/tree-vect-loop.c | |
parent | 6e98053e6984aca2ff1fb00730cc30b5acb7c658 (diff) | |
download | gcc-c1bee668987f371617586edafa0dfccf04162a83.tar.gz |
2015-06-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/66510
* tree-vect-stmts.c (vectorizable_load): Properly compute the
number of vector loads for SLP permuted loads.
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Also
check the stride for loop vectorization.
(vect_enhance_data_refs_alignment): Deal with SLP adjusted
vectorization factor.
(vect_analyze_group_access): If the group size is not a power
of two require a epilogue loop.
* tree-vect-loop.c (vect_analyze_loop_2): Move alignment
compute and optimizing and alias test pruning after final
vectorization factor computation.
* tree-vect-slp.c (vect_build_slp_tree_1): Remove check on
vector alignment.
(vect_transform_slp_perm_load): Properly compute the original
number of vector load stmts.
* gcc.dg/vect/slp-perm-12.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224598 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 584a32cb79b..4b01ade1398 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -1791,6 +1791,22 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo) return false; } + /* Check the SLP opportunities in the loop, analyze and build SLP trees. */ + ok = vect_analyze_slp (loop_vinfo, NULL, n_stmts); + if (!ok) + return false; + + /* If there are any SLP instances mark them as pure_slp. */ + bool slp = vect_make_slp_decision (loop_vinfo); + if (slp) + { + /* Find stmts that need to be both vectorized and SLPed. */ + vect_detect_hybrid_slp (loop_vinfo); + + /* Update the vectorization factor based on the SLP decision. */ + vect_update_vf_for_slp (loop_vinfo); + } + /* Analyze the alignment of the data-refs in the loop. Fail if a data reference is found that cannot be vectorized. */ @@ -1830,31 +1846,17 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo) return false; } - /* Check the SLP opportunities in the loop, analyze and build SLP trees. */ - ok = vect_analyze_slp (loop_vinfo, NULL, n_stmts); - if (ok) + if (slp) { - /* If there are any SLP instances mark them as pure_slp. */ - if (vect_make_slp_decision (loop_vinfo)) - { - /* Find stmts that need to be both vectorized and SLPed. */ - vect_detect_hybrid_slp (loop_vinfo); - - /* Update the vectorization factor based on the SLP decision. */ - vect_update_vf_for_slp (loop_vinfo); - - /* Analyze operations in the SLP instances. Note this may - remove unsupported SLP instances which makes the above - SLP kind detection invalid. */ - unsigned old_size = LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length (); - vect_slp_analyze_operations (LOOP_VINFO_SLP_INSTANCES (loop_vinfo), - LOOP_VINFO_TARGET_COST_DATA (loop_vinfo)); - if (LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length () != old_size) - return false; - } + /* Analyze operations in the SLP instances. Note this may + remove unsupported SLP instances which makes the above + SLP kind detection invalid. */ + unsigned old_size = LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length (); + vect_slp_analyze_operations (LOOP_VINFO_SLP_INSTANCES (loop_vinfo), + LOOP_VINFO_TARGET_COST_DATA (loop_vinfo)); + if (LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length () != old_size) + return false; } - else - return false; /* Scan all the remaining operations in the loop that are not subject to SLP and make sure they are vectorizable. */ |