> But try_combine() doesn't take that into account:
>
>   /* If we had to change another insn, make sure it is valid also.  */
>   if (undobuf.other_insn)
>     {
>       rtx other_pat = PATTERN (undobuf.other_insn);
> ...
>       other_code_number = recog_for_combine (&other_pat,
> undobuf.other_insn, &new_other_notes);
> ...
>       PATTERN (undobuf.other_insn) = other_pat;
>
> This is not (necessarily) the same other_pat that we started with.

Right, that's why the code is written indirectly.

> Index: gcc/combine.c
> ===================================================================
> --- gcc/combine.c     (revision 125984)
> +++ gcc/combine.c     (working copy)
> @@ -3298,7 +3298,7 @@ try_combine (rtx i3, rtx i2, rtx i1, int
>         return 0;
>       }
>
> -      PATTERN (undobuf.other_insn) = other_pat;
> +      SUBST (PATTERN (undobuf.other_insn), other_pat);

I'm not too thrilled by this.  I think that the above code is meant to be the 
last verification before committing the change, but is not (anymore?) since 
there are 2 calls to undo_all right after it.

Would it solve your problem to move the block of code after the 2 calls?

-- 
Eric Botcazou

Reply via email to