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)

Reply via email to