aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-10-14 14:00:25 +0100
committerTamar Christina <tamar.christina@arm.com>2024-10-14 14:00:25 +0100
commitbe966baa353dfcc20b76b5a5586ab2494bb0a735 (patch)
treebba9e37d713088829d26297e22c5409f54144bc5
parent306834b7f74ab61160f205e04f5bf35b71f9ec52 (diff)
downloadgcc-be966baa353dfcc20b76b5a5586ab2494bb0a735.zip
gcc-be966baa353dfcc20b76b5a5586ab2494bb0a735.tar.gz
gcc-be966baa353dfcc20b76b5a5586ab2494bb0a735.tar.bz2
simplify-rtx: Fix incorrect folding of shift and AND [PR117012]
The optimization added in r15-1047-g7876cde25cbd2f is using the wrong operaiton to check for uniform constant vectors. The Author intended to check that all the lanes in the vector are the same and so used CONST_VECTOR_DUPLICATE_P. However this only checks that the vector is created from a pattern duplication, but doesn't say how many pattern alternatives make up the duplication. Normally would would need to check this separately or use const_vec_duplicate_p. Without this the optimization incorrectly triggers. gcc/ChangeLog: PR rtl-optimization/117012 * simplify-rtx.cc (simplify_context::simplify_binary_operation_1): Use const_vec_duplicate_p instead of CONST_VECTOR_DUPLICATE_P. gcc/testsuite/ChangeLog: PR rtl-optimization/117012 * gcc.target/aarch64/pr117012.c: New test.
-rw-r--r--gcc/simplify-rtx.cc4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr117012.c16
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
index dc0d192..4d024ec 100644
--- a/gcc/simplify-rtx.cc
+++ b/gcc/simplify-rtx.cc
@@ -4088,10 +4088,10 @@ simplify_context::simplify_binary_operation_1 (rtx_code code,
if (VECTOR_MODE_P (mode) && GET_CODE (op0) == ASHIFTRT
&& (CONST_INT_P (XEXP (op0, 1))
|| (GET_CODE (XEXP (op0, 1)) == CONST_VECTOR
- && CONST_VECTOR_DUPLICATE_P (XEXP (op0, 1))
+ && const_vec_duplicate_p (XEXP (op0, 1))
&& CONST_INT_P (XVECEXP (XEXP (op0, 1), 0, 0))))
&& GET_CODE (op1) == CONST_VECTOR
- && CONST_VECTOR_DUPLICATE_P (op1)
+ && const_vec_duplicate_p (op1)
&& CONST_INT_P (XVECEXP (op1, 0, 0)))
{
unsigned HOST_WIDE_INT shift_count
diff --git a/gcc/testsuite/gcc.target/aarch64/pr117012.c b/gcc/testsuite/gcc.target/aarch64/pr117012.c
new file mode 100644
index 0000000..537c0fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr117012.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define vector16 __attribute__((vector_size(16)))
+
+vector16 unsigned char
+g (vector16 unsigned char a)
+{
+ vector16 signed char b = (vector16 signed char)a;
+ b = b >> 7;
+ vector16 unsigned char c = (vector16 unsigned char)b;
+ vector16 unsigned char d = { 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 };
+ return c & d;
+}
+
+/* { dg-final { scan-assembler-times {and\tv[0-9]+\.16b, v[0-9]+\.16b, v[0-9]+\.16b} 1 } } */