On Mon, Nov 26, 2018 at 04:20:18PM -0600, Segher Boessenkool wrote:
> > --- gcc/config/rs6000/rs6000.c.jj   2018-11-16 21:35:42.497982764 +0100
> > +++ gcc/config/rs6000/rs6000.c      2018-11-26 10:56:28.079516458 +0100
> > @@ -20644,7 +20644,11 @@ print_operand (FILE *file, rtx x, int co
> >  
> >      case 'D':
> >        /* Like 'J' but get to the GT bit only.  */
> > -      gcc_assert (REG_P (x));
> > +      if (!REG_P (x))
> > +   {
> > +     output_operand_lossage ("invalid %%D value");
> > +     return;
> > +   }
> >  
> >        /* Bit 1 is GT bit.  */
> >        i = 4 * (REGNO (x) - CR0_REGNO) + 1;
> 
> 'D' just blows up if you pass it something not a CR field (well, it compiles
> into something that doesn't assemble).

I can add || !CR_REGNO_P (REGNO (x)) .

> 'J' uses ccr_bit.  This actually explodes (a gcc_assert, an ICE).

Oops, I thought ccr_bit will just return -1.
So, shall we change all the gcc_assert/gcc_unreachable in ccr_bit to
(conditional) return -1; and perhaps add gcc_assert in the non-print_operand
callers?

> > @@ -20900,7 +20904,11 @@ print_operand (FILE *file, rtx x, int co
> >  
> >      case 't':
> >        /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
> > -      gcc_assert (REG_P (x) && GET_MODE (x) == CCmode);
> > +      if (!REG_P (x) || GET_MODE (x) != CCmode)
> > +   {
> > +     output_operand_lossage ("invalid %%t value");
> > +     return;
> > +   }
> >  
> >        /* Bit 3 is OV bit.  */
> >        i = 4 * (REGNO (x) - CR0_REGNO) + 3;
> 
> 't' does not seem easy to blow up, heh.
> 
> Both 'D' and 't', as well as ccr_bit, should use cc_reg_operand I think?
> That allows some pseudos as well, but that doesn't matter.

It also allows SUBREGs and the code will crash badly if they appear.
Testing just REG_P (x) && CR_REGNO_P (REGNO (x)) seems better to me.

> > @@ -21059,7 +21067,11 @@ print_operand (FILE *file, rtx x, int co
> >      names.  If we are configured for System V (or the embedded ABI) on
> >      the PowerPC, do not emit the period, since those systems do not use
> >      TOCs and the like.  */
> > -      gcc_assert (GET_CODE (x) == SYMBOL_REF);
> > +      if (GET_CODE (x) != SYMBOL_REF)
> 
> SYMBOL_REF_P please.

Ok.

        Jakub

Reply via email to