RFC: make combine do as advertised (cheaper-than)?

Richard Biener richard.guenther@gmail.com
Mon Jul 6 07:50:42 GMT 2020


On Mon, Jul 6, 2020 at 4:03 AM Hans-Peter Nilsson via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Most comments, including the second sentence in the head comment
> of combine_validate_cost, the main decision-maker of the combine
> pass, refer to the function as returning true if the new
> insns(s) *cheaper* than the old insns, when in fact the function
> returned true also if the cost was the same.  Returning true for
> cheaper also seems more sane than as-cheap-as considering the
> need to avoid oscillation between same-cost combinations.  Also,
> it makes the job of later passes harder, having combine make
> more complex combinations of the same cost.
>
> Right, you can affect this with your target TARGET_RTX_COSTS and
> TARGET_INSN_COST hooks, but only for trivial cases, and you have
> increasingly more complex combinations (many-to-many
> combinations) where you have to twist simple logic to appease
> combine (stop it from combining) or give up.
>
> Main-interest ports are unsurprisingly pretty tied to this
> effect.  I'd love to install the following patch, adjusting the
> function and the two opposing comments.  But...it causes
> hundreds of regressions for each of x86_64-linux and
> aarch64-linux (tens for ppc64le-linux), so I'm just not up to
> the task, at least not without previous buy-in from reviewers.
>
> It would need those targets to have their TARGET_INSN_COST
> and/or TARGET_RTX_COSTS functions adjusted.
>
> Alternatives from the top of my head, one of:
>
> - With buy-in from global reviewers, installing this patch on a
> development branch and let all target maintainers adjust their
> target test-cases and cost-functions there, for merge when
> first-class targets are done.  (I'm a dreamer.)
>
> - A target combine hook for the decision (passing for inspection
> tuples of from-insns and to-insns and costs) and just falling
> back to the current addition of rtx costs.
>
> - A simpler target combine decision hook that says which one of
> "cheaper" or "as-cheap-as".

A target combine decision hook that on old == new cost
decides between both and given the actual insns?  Might
lead to quite hackish target hook implementations...

> - Adjusting documentation and comments that are currently
> untruthful about the cost decision to instead say (to the effect
> of) "as cheap as" instead of "cheaper".

Well, adjusting the function comment to reflect reality is
kind-of obvious ;)

> So, WDYT?
>
> (Tested as above, causing massive pattern-match regressions.)
>
> gcc:
>         * combine.c (combine_validate_cost): Reject unless the new total
>         cost is cheaper than the original.  Adjust the minority of
>         comments that don't say "cheaper":
>
> ---
>  gcc/combine.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/combine.c b/gcc/combine.c
> index f69413a..7da144e 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -846,8 +846,8 @@ do_SUBST_LINK (struct insn_link **into, struct insn_link *newval)
>     than the original sequence I0, I1, I2, I3 and undobuf.other_insn.  Note
>     that I0, I1 and/or NEWI2PAT may be NULL_RTX.  Similarly, NEWOTHERPAT and
>     undobuf.other_insn may also both be NULL_RTX.  Return false if the cost
> -   of all the instructions can be estimated and the replacements are more
> -   expensive than the original sequence.  */
> +   of all the instructions can be estimated and the replacements are not
> +   cheaper than the original sequence.  */
>
>  static bool
>  combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3,
> @@ -938,8 +938,8 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3,
>      }
>
>    /* Disallow this combination if both new_cost and old_cost are greater than
> -     zero, and new_cost is greater than old cost.  */
> -  int reject = old_cost > 0 && new_cost > old_cost;
> +     zero, and new_cost is greater than or equal to the old cost.  */
> +  int reject = old_cost > 0 && new_cost >= old_cost;
>
>    if (dump_file)
>      {
> --
> 2.11.0


More information about the Gcc-patches mailing list