On Thu, Nov 12, 2015 at 5:08 PM, Ilya Enkovich <[email protected]> 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. 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
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for trunk?
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2015-11-12 Ilya Enkovich <[email protected]>
>
> * 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
CONVERT_EXPR_CODE_P (rhs_code)
> + && !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);
So what's the actual issue here? That the conversion is spurious?
Why can't you accept this simply in vectorizable_assignment then?
Richard.
> + *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)