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. 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 <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
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)