Richard Biener <[email protected]> writes:
> On Fri, Dec 9, 2016 at 2:08 PM, Richard Sandiford
> <[email protected]> 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,
>>