Hi All, The following patch has been bootstrapped and regtested on powerpc64le-linux.
while generating vector pairs of load & store instruction, the src address was treated as an altivec type and that type of address is invalid for lxvp and stxvp insns. The solution for this is to avoid altivec type address for OOmode and XOmode. 2023-07-05 Jeevitha Palanisamy <jeevi...@linux.ibm.com> gcc/ PR target/110411 * config/rs6000/rs6000.cc (rs6000_legitimate_address_p): Avoid altivec address for OOmode and XOmde. gcc/testsuite/ PR target/110411 * gcc.target/powerpc/pr110411.c: New testcase. diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 07c3a3d15ac..b914c65e5c9 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -9894,6 +9894,8 @@ rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict) /* Handle unaligned altivec lvx/stvx type addresses. */ if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) + && mode != OOmode + && mode != XOmode && GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) == -16) diff --git a/gcc/testsuite/gcc.target/powerpc/pr110411.c b/gcc/testsuite/gcc.target/powerpc/pr110411.c new file mode 100644 index 00000000000..83ef0638fb2 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr110411.c @@ -0,0 +1,21 @@ +/* PR target/110411 */ +/* { dg-options "-O2 -mdejagnu-cpu=power10 -S -mblock-ops-vector-pair" } */ + +/* Verify we do not ICE on the following. */ + +#include <string.h> + +struct s { + long a; + long b; + long c; + long d: 1; +}; +unsigned long ptr; + +void +foo (struct s *dst) +{ + struct s *src = (struct s *)(ptr & ~0xFUL); + memcpy (dst, src, sizeof(struct s)); +}