2015-12-02 17:52 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: > 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?
The problem is that conversion is supposed to be handled by vectorizable_conversion, but it fails to because it is not actually a conversion. I suppose it may be handled in vectorizable_assignment but I chose this pattern because it's meant to handle mask conversion issues. Thanks, Ilya > > 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)