Hi Jakub, On Mon, Nov 26, 2018 at 09:43:47PM +0100, Jakub Jelinek wrote: > The following patch fixes a bunch of ICEs in rs6000 print_operand; we > shouldn't ICE on them when users write mess in their inline asm.
> 2018-11-26 Jakub Jelinek <ja...@redhat.com> > > PR target/88188 > * config/rs6000/rs6000.c (print_operand) <case 'D'>: Use > output_operand_lossage instead of gcc_assert. > <case 't'>: Likewise. > <case 'z'>: Likewise. > <case 'V'>: Use output_operand_lossage instead of gcc_unreachable. > > * gcc.target/powerpc/pr88188.c: New test. > --- 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). 'J' uses ccr_bit. This actually explodes (a gcc_assert, an ICE). > @@ -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. > @@ -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. Okay for trunk. Thanks! Segher