This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [24/67] Replace a != BLKmode check with is_a <scalar_int_mode>
On Fri, Dec 9, 2016 at 2:08 PM, Richard Sandiford
<richard.sandiford@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.
Richard.
> gcc/
> 2016-11-24 Richard Sandiford <richard.sandiford@arm.com>
> Alan Hayward <alan.hayward@arm.com>
> David Sherwood <david.sherwood@arm.com>
>
> * gimple-fold.c (gimple_fold_builtin_memory_op): Use
> is_a <scalar_int_mode> instead of != BLKmode.
>
> 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,
>