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