Message ID | 87lgvpl06o.fsf@e105548-lin.cambridge.arm.com |
---|---|
State | New |
Headers | show |
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, >
Richard Biener <richard.guenther@gmail.com> writes: > 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. 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, >>
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,