rs6000: Fix invalid splits when using Altivec style addresses [PR98959]

Segher Boessenkool segher@kernel.crashing.org
Fri Feb 12 23:36:13 GMT 2021


On Fri, Feb 12, 2021 at 02:50:12PM -0600, Peter Bergner wrote:
> The rs6000_emit_le_vsx_* functions assume they are not passed an Altivec
> style "& ~16" address.  However, some of our expanders and splitters do
> not verify we do not have an Altivec style address before calling those
> functions, leading to an ICE.  The solution here is to guard the expanders
> and splitters to ensure we do not call them if we're given an Altivec style
> address.

> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -10059,6 +10059,11 @@ rs6000_const_vec (machine_mode mode)
>  void
>  rs6000_emit_le_vsx_permute (rtx dest, rtx source, machine_mode mode)
>  {
> +  if (MEM_P (dest))
> +    gcc_assert (!altivec_indexed_or_indirect_operand (dest, mode));
> +  if (MEM_P (source))
> +    gcc_assert (!altivec_indexed_or_indirect_operand (source, mode));

altivec_indexed_or_indirect_operand returns false if passed something
not a mem, so this is just

  gcc_assert (!altivec_indexed_or_indirect_operand (dest, mode));
  gcc_assert (!altivec_indexed_or_indirect_operand (source, mode));

Please retest with that tweak.  Okay for trunk.  Thanks!

Also okay for GCC 10.  Do you need backports to earlier?  Which then?


Segher


More information about the Gcc-patches mailing list