This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [10/nn] Widening optab cleanup
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, richard dot sandiford at linaro dot org
- Date: Mon, 30 Oct 2017 12:25:16 -0600
- Subject: Re: [10/nn] Widening optab cleanup
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=law at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 95C41369C9
- References: <87wp3mxgir.fsf@linaro.org> <87po9ew1jf.fsf@linaro.org>
On 10/23/2017 05:23 AM, Richard Sandiford wrote:
> widening_optab_handler had the comment:
>
> /* ??? Why does find_widening_optab_handler_and_mode attempt to
> widen things that can't be widened? E.g. add_optab... */
> if (op > LAST_CONV_OPTAB)
> return CODE_FOR_nothing;
>
> I think it comes from expand_binop using
> find_widening_optab_handler_and_mode for two things: to test whether
> a "normal" optab like add_optab is supported for a standard binary
> operation and to test whether a "convert" optab is supported for a
> widening operation like umul_widen_optab. In the former case from_mode
> and to_mode must be the same, in the latter from_mode must be narrower
> than to_mode.
>
> For the former case, find_widening_optab_handler_and_mode is only really
> testing the modes that are passed in. permit_non_widening must be true
> here.
>
> For the latter case, find_widening_optab_handler_and_mode should only
> really consider new from_modes that are wider than the original
> from_mode and narrower than the original to_mode. Logically
> permit_non_widening should be false, since widening optabs aren't
> supposed to take operands that are the same width as the destination.
> We get away with permit_non_widening being true because no target
> would/should define a widening .md pattern with matching modes.
>
> But really, it seems better for expand_binop to handle these two
> cases itself rather than pushing them down. With that change,
> find_widening_optab_handler_and_mode is only ever called with
> permit_non_widening set to false and is only ever called with
> a "proper" convert optab. We then no longer need widening_optab_handler,
> we can just use convert_optab_handler directly.
>
> The patch also passes the instruction code down to expand_binop_directly.
> This should be more efficient and removes an extra call to
> find_widening_optab_handler_and_mode.
>
>
> 2017-10-23 Richard Sandiford <richard.sandiford@linaro.org>
> Alan Hayward <alan.hayward@arm.com>
> David Sherwood <david.sherwood@arm.com>
>
> gcc/
> * optabs-query.h (convert_optab_p): New function, split out from...
> (convert_optab_handler): ...here.
> (widening_optab_handler): Delete.
> (find_widening_optab_handler): Remove permit_non_widening parameter.
> (find_widening_optab_handler_and_mode): Likewise. Provide an
> override that operates on mode class wrappers.
> * optabs-query.c (widening_optab_handler): Delete.
> (find_widening_optab_handler_and_mode): Remove permit_non_widening
> parameter. Assert that the two modes are the same class and that
> the "from" mode is narrower than the "to" mode. Use
> convert_optab_handler instead of widening_optab_handler.
> * expmed.c (expmed_mult_highpart_optab): Use convert_optab_handler
> instead of widening_optab_handler.
> * expr.c (expand_expr_real_2): Update calls to
> find_widening_optab_handler.
> * optabs.c (expand_widen_pattern_expr): Likewise.
> (expand_binop_directly): Take the insn_code as a parameter.
> (expand_binop): Only call find_widening_optab_handler for
> conversion optabs; use optab_handler otherwise. Update calls
> to find_widening_optab_handler and expand_binop_directly.
> Use convert_optab_handler instead of widening_optab_handler.
> * tree-ssa-math-opts.c (convert_mult_to_widen): Update calls to
> find_widening_optab_handler and use scalar_mode rather than
> machine_mode.
> (convert_plusminus_to_widen): Likewise.
OK.
jeff