On 06/28/2016 12:18 AM, Bin Cheng wrote:
Hi,
This patch improves vectorizer in order to handle possible infinite loops by 
versioning.  Its changes fall in three categories.
A) Changes in vect_get_loop_niters.  AT the moment, it computes niter using 
number_of_executions_latch, in this way the assumption is discarded and loop 
not vectorized.  To fix the issue, we need assumption information from niter 
analyzer and use that as a break condition to version the loop.  This patch 
uses newly introduced interface number_of_iterations_exit_assumptions and 
passes assumptions all the way to vect_analyze_loop_form.  The assumptions will 
be finally recorded in LOOP_VINFO_NITERS_ASSUMPTIONS.
B) It sets and clears flag LOOP_F_ASSUMPTIONS for loop.  The flag is important 
because during checking if a loop can be vectorized (with versioning), all data 
references need to be analyzed by assuming LOOP_VINFO_NITERS_ASSUMPTIONS is 
TRUE.  Otherwise it's very likely address expression of data reference won't be 
identified as SCEV and vectorization would fail.  With this flag set to TRUE, 
niter analyzer will bypass assumptions recorded LOOP_VINFO_NITERS_ASSUMPTIONS.  
I also keep this flag for versioned loop because the assumption is guaranteed 
to be TRUE after versioning.  For now, I didn't copy these flags in 
copy_loop_info, but I think this can be done so that the flags can be inherited 
by peeled pre/post loop.  Maybe in follow up patches.  Also it's possible to 
turn other bool fields into flags in the future?
C) This patch uses existing infrastructure to version a loop against 
LOOP_VINFO_NITERS_ASSUMPTIONS, just like for alignment or alias check.  The 
change is straightforward, however, I did refactoring to versioning related 
macros hoping the code would be cleaner.

Bootstrap and test along with previous niter patches on x86_64 and AArch64.  Is 
it OK?
So I have one high level concern -- how (if at all) does this interact with Ilya's changes to vectorize loop tails that are just about through the review process?

Related -- I see that you throw away the SCEV/iteration knowledge then analyze the loop using the given assumptions, then eventually throw that information away. Which sounds generally reasonable -- except for one potential issue -- does anything still want to look at the original SCEV/iteration information (that we've lost)? I'm assuming no since you didn't try to restore it and we pass the testsuite with your change.



Thanks,
bin

2016-06-27  Bin Cheng  <bin.ch...@arm.com>

        PR tree-optimization/57558
        * tree-vect-loop-manip.c (vect_create_cond_for_niters_checks): New
        function.
        (vect_loop_versioning): Support versioning with niter assumptions.
        * tree-vect-loop.c (tree-ssa-loop.h): Include new header file.
        (vect_get_loop_niters): New parameter.  Reimplement to support
        assumptions in loop niter info.
        (vect_analyze_loop_form_1, vect_analyze_loop_form): Ditto.
        (new_loop_vec_info): Init LOOP_VINFO_NITERS_ASSUMPTIONS.
        (vect_estimate_min_profitable_iters): Use LOOP_REQUIRES_VERSIONING.
        * tree-vectorizer.c (vect_free_loop_info_assumptions): New function.
        (vectorize_loops): Free loop niter info for loops with flag
        LOOP_F_ASSUMPTIONS set.
        * tree-vectorizer.h (struct _loorefactoredp_vec_info): New field
Typo in the ChangeLog entry.

        num_iters_assumptions.
        (LOOP_VINFO_NITERS_ASSUMPTIONS): New macro.
        (LOOP_REQUIRES_VERSIONING_FOR_NITERS): New macro.
        (LOOP_REQUIRES_VERSIONING): New macro.
        (vect_free_loop_info_assumptions): New decl.

gcc/testsuite/ChangeLog
2016-06-27  Bin Cheng  <bin.ch...@arm.com>

        * gcc.dg/vect/pr57558-1.c: New test.
        * gcc.dg/vect/pr57558-2.c: New test.
I was rather surprised at how simple supporting this case was. THe two high level questions above are the only things I'm worried about. Let's figure out the answers to those questions before we OK this for the trunk.
Jeff

Reply via email to