Vectorizer invariant detextion fix

Richard Guenther richard.guenther@gmail.com
Tue May 1 10:23:00 GMT 2007


On 5/1/07, Jan Hubicka <jh@suse.cz> wrote:
>
> Hi,
> for the vectorizer-1.c testcase on i686:
> extern char lanip[3][40];
> typedef struct
> {
>   char *t[4];
> }tx_typ;
>
> int set_names (void)
> {
>   static tx_typ tt1;
>   int ln;
>   for (ln = 0; ln < 4; ln++)
>       tt1.t[ln] = lanip[1];
> }
>
> We now fold (type)lanip[1]; that is an invariant expression lifted out of the
> loop into &lanip[1][0] that is gimple_min_invariant and not moved out of the
> loop.  This confuse vectorizer and make it to give up on the loop.  I believe
> that all we need is to make gimple_min_invariant considered invariant by
> vectorizer.

Yes, that's correct.

> Bootstrapped/regtested i686-linux, ppc-linux and ia64-linux.
> OK?

Ok,

Thanks,
Richard.

>         * tree-vectorize.c (vect_is_simple_use): gimple_min_invariant is
>         invariant.
> Index: tree-vectorizer.c
> ===================================================================
> *** tree-vectorizer.c   (revision 124303)
> --- tree-vectorizer.c   (working copy)
> *************** vect_is_simple_use (tree operand, loop_v
> *** 1644,1649 ****
> --- 1644,1655 ----
>         *dt = vect_constant_def;
>         return true;
>       }
> +   if (is_gimple_min_invariant (operand))
> +    {
> +       *def = operand;
> +       *dt = vect_invariant_def;
> +       return true;
> +    }
>
>     if (TREE_CODE (operand) != SSA_NAME)
>       {
> *************** vect_is_simple_use (tree operand, loop_v
> *** 1671,1677 ****
>     if (IS_EMPTY_STMT (*def_stmt))
>       {
>         tree arg = TREE_OPERAND (*def_stmt, 0);
> !       if (TREE_CODE (arg) == INTEGER_CST || TREE_CODE (arg) == REAL_CST)
>           {
>             *def = operand;
>             *dt = vect_invariant_def;
> --- 1677,1683 ----
>     if (IS_EMPTY_STMT (*def_stmt))
>       {
>         tree arg = TREE_OPERAND (*def_stmt, 0);
> !       if (is_gimple_min_invariant (arg))
>           {
>             *def = operand;
>             *dt = vect_invariant_def;
>



More information about the Gcc-patches mailing list