On Thu, Nov 12, 2015 at 5:08 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> Hi,
>
> When we use LTO for fortran we may have a mix 32bit and 1bit scalar booleans. 
> It means we may have conversion of one scalar type to another which confuses 
> vectorizer because values with different scalar boolean type may get the same 
> vectype.

Confuses aka fails to vectorize?

>  This patch transforms such conversions into comparison.
>
> I managed to make a small fortran test which gets vectorized with this patch 
> but I didn't find how I can run fortran test with LTO and then scan tree dump 
> to check it is vectorized.  BTW here is a loop from the test:
>
>       real*8 a(18)
>       logical b(18)
>       integer i
>
>       do i=1,18
>          if(a(i).gt.0.d0) then
>             b(i)=.true.
>          else
>             b(i)=.false.
>          endif
>       enddo

This looks the the "error" comes from if-conversion - can't we do
better there then?

Richard.

> Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for trunk?
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2015-11-12  Ilya Enkovich  <enkovich....@gmail.com>
>
>         * tree-vect-patterns.c (vect_recog_mask_conversion_pattern):
>         Transform useless boolean conversion into assignment.
>
>
> diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
> index b9d900c..62070da 100644
> --- a/gcc/tree-vect-patterns.c
> +++ b/gcc/tree-vect-patterns.c
> @@ -3674,6 +3674,38 @@ vect_recog_mask_conversion_pattern (vec<gimple *> 
> *stmts, tree *type_in,
>    if (TREE_CODE (TREE_TYPE (lhs)) != BOOLEAN_TYPE)
>      return NULL;
>
> +  /* Check conversion between boolean types of different sizes.
> +     If no vectype is specified, then we have a regular mask
> +     assignment with no actual conversion.  */
> +  if (rhs_code == CONVERT_EXPR
> +      && !STMT_VINFO_DATA_REF (stmt_vinfo)
> +      && !STMT_VINFO_VECTYPE (stmt_vinfo))
> +    {
> +      if (TREE_CODE (rhs1) != SSA_NAME)
> +       return NULL;
> +
> +      rhs1_type = search_type_for_mask (rhs1, vinfo);
> +      if (!rhs1_type)
> +       return NULL;
> +
> +      vectype1 = get_mask_type_for_scalar_type (rhs1_type);
> +
> +      if (!vectype1)
> +       return NULL;
> +
> +      lhs = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL);
> +      pattern_stmt = gimple_build_assign (lhs, rhs1);
> +
> +      *type_out = vectype1;
> +      *type_in = vectype1;
> +      stmts->safe_push (last_stmt);
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_NOTE, vect_location,
> +                         "vect_recog_mask_conversion_pattern: detected:\n");
> +
> +      return pattern_stmt;
> +    }
> +
>    if (rhs_code != BIT_IOR_EXPR
>        && rhs_code != BIT_XOR_EXPR
>        && rhs_code != BIT_AND_EXPR)

Reply via email to