[PATCH][combine] PR rtl-optimization/68381: Only restrict pure simplification in mult-extend subst case, allow other substitutions

Segher Boessenkool segher@kernel.crashing.org
Thu Nov 19 14:41:00 GMT 2015


On Thu, Nov 19, 2015 at 01:38:53PM +0000, Kyrill Tkachov wrote:
> >That is troublesome.  Could you look deeper?
> 
> Yes.

Thanks.

> So the bad case is when we're in subst and returning a CLOBBER of zero
> and 'from' is (reg/v:SI 80 [ x ]) and 'to' is (zero_extend:SI (reg:HI 0 x0 
> [ x ])).
> The call to subst comes from try_combine at line 3403:
> 
>    if (added_sets_1)
>     {
>       rtx t = i1pat;
>       if (i0_feeds_i1_n)
>         t = subst (t, i0dest, i0src_copy ? i0src_copy : i0src, 0, 0, 0);
> 
>       XVECEXP (newpat, 0, --total_sets) = t;
>     }
> 
> It uses t after calling subst on it without checking that it didn't return 
> a clobber.
> If I change that snippet to check for CLOBBER:
>   if (added_sets_1)
>     {
>       rtx t = i1pat;
>       if (i0_feeds_i1_n)
>         t = subst (t, i0dest, i0src_copy ? i0src_copy : i0src, 0, 0, 0);
> 
>       if (GET_CODE (t) == CLOBBER)
>         {
>           undo_all ();
>           return 0;
>         }
>       XVECEXP (newpat, 0, --total_sets) = t;
>     }
> 
> The testcase gets fixed.
> But shouldn't the XVECEXP (newpat, 0, --total_sets) = t; line create an 
> uncrecognizable rtx
> that would then get rejected by combine or something?

Yes.  recog_for_combine_1 checks for a PARALLEL with such a CLOBBER
right at the start; and of course having the clobber elsewhere will
just not match.

> If we don't check for clobber there and perform the "XVECEXP = ..."
> the resulting newpat looks like:
> (parallel [
>         (set (reg:CC 66 cc)
>             (compare:CC (const_int 0 [0])
>                 (const_int 0 [0])))
>         (nil)
>         (clobber:DI (const_int 0 [0]))
>     ])
> 
> ah, so the clobber is put in a parallel with another insn and is thus 
> accepted by recog?

No, recog_for_combine should refuse it because of that third arm.
The second arm (the nil) looks very wrong, where is that coming
from?  That isn't valid RTL.

> So, should we check 't' after subst for clobbers as above? Or should this 
> be fixed in
> some other place?

There is a bug somewhere, so that will need fixing.  Workarounds are
last resort, and even then we really need to know what is going on.

> Thanks. In light of the above I think this patch happens to avoid
> the issue highlighted above but we should fix the above code separately?

Yes, if your patch creates better code we want it (and fix the regression),
but you exposed a separate bug as well :-)


Segher



More information about the Gcc-patches mailing list