On Wed, Dec 2, 2015 at 4:24 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 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.

I think it's always better to avoid patterns if you can.

Richard.

> 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