On Tue, Jun 8, 2021 at 12:05 AM Segher Boessenkool
<seg...@kernel.crashing.org> wrote:
>
> In theory we could have a split condition not inclusive of the insn
> condition in the past.  That never was a good idea, the code does not do
> what a non-suspicious reader would think it does.  But it leads to more
> serious problems together with iterators: if the split condition (as
> written) does not start with "&&", you do not get the insn condition
> included in the split condition, and that holds for the part of the insn
> condition that was generated by the iterator as well!
>
> This patch simply always joins the two conditions (after the iterators
> have done their work) to get the effective split condition.
>
> I tested this on all Linux targets, building the Linux kernel for each,
> and it does not change generated code for any of them, so I think we do
> not have much breakage to fear.  But it is possible for other targets of
> course, and for floating point or vector code, etc.
>
> Is this okay for trunk?

Even if it looks uglier I would prefer to enforce a leading "&& " on the
split condition.  That keeps the semantic of the define_insn_and_split
the same on trunk and branches and thus maintaining things easier.
I suppose once branches without such enforcement go out of
maintainance we can mass-strip the "&& "s.

I guess a mass-change to add "&& "s at this point is smaller than
a corresponding change to drop them (IMHO leaving both after this
change would be confusing).

Richard.

>
> Segher
>
>
> 2021-06-07  Segher Boessenkool  <seg...@kernel.crashing.org>
>
>         * gensupport.c (process_rtx) [DEFINE_INSN_AND_SPLIT]: Always include
>         the insn condition in the split condition.
>
> ---
>  gcc/gensupport.c | 25 ++++++++++++++++---------
>  1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/gensupport.c b/gcc/gensupport.c
> index 2cb760ffb90f..8a6345d36470 100644
> --- a/gcc/gensupport.c
> +++ b/gcc/gensupport.c
> @@ -590,7 +590,6 @@ process_rtx (rtx desc, file_location loc)
>      case DEFINE_INSN_AND_SPLIT:
>      case DEFINE_INSN_AND_REWRITE:
>        {
> -       const char *split_cond;
>         rtx split;
>         rtvec attr;
>         int i;
> @@ -609,17 +608,25 @@ process_rtx (rtx desc, file_location loc)
>             remove_constraints (XVECEXP (split, 0, i));
>           }
>
> -       /* If the split condition starts with "&&", append it to the
> -          insn condition to create the new split condition.  */
> -       split_cond = XSTR (desc, 4);
> -       if (split_cond[0] == '&' && split_cond[1] == '&')
> +       const char *insn_cond = XSTR (desc, 2);
> +       const char *split_cond = XSTR (desc, 4);
> +       if (strncmp (split_cond, "&&", 2)
> +           && GET_CODE (desc) == DEFINE_INSN_AND_REWRITE)
> +         error_at (loc, "the rewrite condition must start with `&&'");
> +
> +       /* If the split condition starts with "&&", skip that.  */
> +       if (!strncmp (split_cond, "&&", 2))
>           {
>             rtx_reader_ptr->copy_md_ptr_loc (split_cond + 2, split_cond);
> -           split_cond = rtx_reader_ptr->join_c_conditions (XSTR (desc, 2),
> -                                                           split_cond + 2);
> +           split_cond += 2;
>           }
> -       else if (GET_CODE (desc) == DEFINE_INSN_AND_REWRITE)
> -         error_at (loc, "the rewrite condition must start with `&&'");
> +
> +       /* Always use the conjunction of the given split condition and the
> +          insn condition (which includes stuff from iterators, it is not just
> +          what is given in the pattern in the machine description) as the
> +          split condition to use.  */
> +       split_cond = rtx_reader_ptr->join_c_conditions (insn_cond, 
> split_cond);
> +
>         XSTR (split, 1) = split_cond;
>         if (GET_CODE (desc) == DEFINE_INSN_AND_REWRITE)
>           XVEC (split, 2) = gen_rewrite_sequence (XVEC (desc, 1));
> --
> 1.8.3.1
>

Reply via email to