This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: expr.c: don't assume MUL for scaling pointers
- From: Hans-Peter Nilsson <hp at bitrange dot com>
- To: DJ Delorie <dj at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 2 Nov 2011 23:35:16 -0400 (EDT)
- Subject: Re: expr.c: don't assume MUL for scaling pointers
- References: <201111030323.pA33Nm9W029413@greed.delorie.com>
On Wed, 2 Nov 2011, DJ Delorie wrote:
>
> GCC assumes the target has a multiply insn, but better code is
> generated using shifts if it doesn't (vs a libcall). Found with the
> rl78-elf port.
>
> * expr.c (expand_expr_real_2): Don't try to emit a MUL-based
> expression if the target doesn't have a multiply pattern. Fall
> back to shifts instead of using libgcc calls.
Wouldn't this stop targets that have a scaling "lea"-type
indexing pattern but no multiply insns from using those
patterns?
>
> Index: gcc/expr.c
> ===================================================================
> --- gcc/expr.c (revision 180758)
> +++ gcc/expr.c (working copy)
> @@ -8289,12 +8289,13 @@ expand_expr_real_2 (sepops ops, rtx targ
> }
>
> /* Attempt to return something suitable for generating an
> indexed address, for machines that support that. */
>
> if (modifier == EXPAND_SUM && mode == ptr_mode
> + && optab_handler (smul_optab, mode) != CODE_FOR_nothing
> && host_integerp (treeop1, 0))
> {
> tree exp1 = treeop1;
>
> op0 = expand_expr (treeop0, subtarget, VOIDmode,
> EXPAND_SUM);
>