> Hi,
> This is the main patch improving control flow graph for vectorized loop.  It 
> generally rewrites loop peeling stuff in vectorizer.  As described in patch, 
> for a typical loop to be vectorized like:
> 
>        preheader:
>      LOOP:
>        header_bb:
>        loop_body
>        if (exit_loop_cond) goto exit_bb
>        else                goto header_bb
>        exit_bb:
> 
> This patch peels prolog and epilog from the loop, adds guards skipping PROLOG 
> and EPILOG for various conditions.  As a result, the changed CFG would look 
> like:
> 
>        guard_bb_1:
>        if (prefer_scalar_loop) goto merge_bb_1
>        else                    goto guard_bb_2
> 
>        guard_bb_2:
>          if (skip_prolog) goto merge_bb_2
>          else             goto prolog_preheader
> 
>        prolog_preheader:
>      PROLOG:
>        prolog_header_bb:
>        prolog_body
>        if (exit_prolog_cond) goto prolog_exit_bb
>        else                  goto prolog_header_bb
>        prolog_exit_bb:
> 
>        merge_bb_2:
> 
>        vector_preheader:
>      VECTOR LOOP:
>        vector_header_bb:
>        vector_body
>        if (exit_vector_cond) goto vector_exit_bb
>        else                  goto vector_header_bb
>        vector_exit_bb:
> 
>        guard_bb_3:
>        if (skip_epilog) goto merge_bb_3
>        else             goto epilog_preheader
> 
>        merge_bb_1:
> 
>        epilog_preheader:
>      EPILOG:
>        epilog_header_bb:
>        epilog_body
>        if (exit_epilog_cond) goto merge_bb_3
>        else                  goto epilog_header_bb
> 
>        merge_bb_3:
> 
> 
Bin,
this patch seems to miss profile updating, so we get mismatches even for quite 
simple loops
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79347
I am bit lost in how the code is organized - it does insert multiple guards to 
the preheader
edge?

Honza

Reply via email to