Richard Biener <richard.guent...@gmail.com> writes:
> On Fri, Dec 9, 2016 at 2:08 PM, Richard Sandiford
> <richard.sandif...@arm.com> wrote:
>> This patch replaces a check against BLKmode with a check
>> of is_a <scalar_int_mode>, in a case where scalar integer
>> modes were the only useful alternatives left.
>
> So why's BLKmode no longer sth valid to check against?  The check is
> only there to guard GET_MODE_ALIGNMENT / SLOW_UNALIGNED_ACCESS.

Checking against BLKmode is still valid.  The patch is just rewriting
the check into an alternative form.  The end goal is to operate on
scalar_int_modes in cases where we know the mode is an integer.

In this case the mode we're checking is the result of a type_for_size
call, which is defined to always return an integer type:

  /* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an
     integer type with at least that precision.  */

TBH I was a bit surprised we could see a BLKmode integer type; I thought
we disallowed types that didn't have a suitable scalar_mode_supported_p
mode.  But assuming that the check is necessary, the only thing it
lets through are scalar integer modes.

Thanks,
Richard

>> diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
>> index d00625b..c6b5411 100644
>> --- a/gcc/gimple-fold.c
>> +++ b/gcc/gimple-fold.c
>> @@ -713,31 +713,29 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator 
>> *gsi,
>>           unsigned ilen = tree_to_uhwi (len);
>>           if (pow2p_hwi (ilen))
>>             {
>> +             scalar_int_mode mode;
>>               tree type = lang_hooks.types.type_for_size (ilen * 8, 1);
>>               if (type
>> -                 && TYPE_MODE (type) != BLKmode
>> -                 && (GET_MODE_SIZE (TYPE_MODE (type)) * BITS_PER_UNIT
>> -                     == ilen * 8)
>> +                 && is_a <scalar_int_mode> (TYPE_MODE (type), &mode)
>> +                 && GET_MODE_SIZE (mode) * BITS_PER_UNIT == ilen * 8
>>                   /* If the destination pointer is not aligned we must be 
>> able
>>                      to emit an unaligned store.  */
>> -                 && (dest_align >= GET_MODE_ALIGNMENT (TYPE_MODE (type))
>> -                     || !SLOW_UNALIGNED_ACCESS (TYPE_MODE (type), 
>> dest_align)
>> -                     || (optab_handler (movmisalign_optab, TYPE_MODE (type))
>> +                 && (dest_align >= GET_MODE_ALIGNMENT (mode)
>> +                     || !SLOW_UNALIGNED_ACCESS (mode, dest_align)
>> +                     || (optab_handler (movmisalign_optab, mode)
>>                           != CODE_FOR_nothing)))
>>                 {
>>                   tree srctype = type;
>>                   tree desttype = type;
>> -                 if (src_align < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
>> +                 if (src_align < GET_MODE_ALIGNMENT (mode))
>>                     srctype = build_aligned_type (type, src_align);
>>                   tree srcmem = fold_build2 (MEM_REF, srctype, src, off0);
>>                   tree tem = fold_const_aggregate_ref (srcmem);
>>                   if (tem)
>>                     srcmem = tem;
>> -                 else if (src_align < GET_MODE_ALIGNMENT (TYPE_MODE (type))
>> -                          && SLOW_UNALIGNED_ACCESS (TYPE_MODE (type),
>> -                                                    src_align)
>> -                          && (optab_handler (movmisalign_optab,
>> -                                             TYPE_MODE (type))
>> +                 else if (src_align < GET_MODE_ALIGNMENT (mode)
>> +                          && SLOW_UNALIGNED_ACCESS (mode, src_align)
>> +                          && (optab_handler (movmisalign_optab, mode)
>>                                == CODE_FOR_nothing))
>>                     srcmem = NULL_TREE;
>>                   if (srcmem)
>> @@ -753,7 +751,7 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
>>                           gimple_set_vuse (new_stmt, gimple_vuse (stmt));
>>                           gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
>>                         }
>> -                     if (dest_align < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
>> +                     if (dest_align < GET_MODE_ALIGNMENT (mode))
>>                         desttype = build_aligned_type (type, dest_align);
>>                       new_stmt
>>                         = gimple_build_assign (fold_build2 (MEM_REF, 
>> desttype,
>>

Reply via email to